overrided方法编译错误

本文介绍了在实现类中Override方法出现编译错误的问题及解决办法。错误表现为方法签名相同但未正确覆盖基类方法,原因是接口引用了已删除的类。通过修正接口中的引用,实现了编译成功。
  • 问题描述:

在实现类中的某一或某几个Override方法发生编译错误如下:

Name clash: The method put(String) of type XXXServiceImpl has the same erasure as put(String) of type XXXService but does not override it

 

当去掉@Override标签之后,编译错误如下:

The method put(String) of type XXXServiceImpl must override or implement a supertype method

 

而且并非所有的重写方法会报编译错误,而且报错的方法和没报错的方法之间找不出indicated differences,非常的蛋疼。。。

 

 

  • 问题原因:

XXXService(接口)中有编译错误,引用了一个已删除的并且不需要的类。

 

  • 解决方案:

删除接口XXXService中不存在的引用,XXXServiceImpl编译成功。

 

 

这个错误犯的很脑残,但确实困扰了我一个小时,因为接口和实现类不在同一个包里,而且注意力全都集中在实现类的编译错误上,再加上编译器的报错也不太友好,所以没发现接口有问题。有时确实会有这样的遭遇,一个问题花了很长时间没法解决,其实问题并不在问题本身,而是由其他问题引发,这个时候先从当前问题跳出来看一下,往往能找到原因。

<think> 这段代码定义了一个函数`compare_subsystem_and_component`,目的是比较子系统(subsystem)和组件(component)的配置信息,检查它们是否符合预期规则。如果不符合,则根据情况打印警告或抛出异常。 函数接收6个参数: 1. subsystem_name: 子系统名称 2. components_name: 组件名称 3. subsystem_components_whitelist_info: 一个字典,表示子系统和组件的白名单信息(允许的组件) 4. part_subsystem_component_info: 一个字典,表示部件(part)的子系统组件信息 5. parts_config_path: 部件配置文件的路径(字符串) 6. subsystem_components_list: 子系统的组件列表(应该是允许的组件列表) 代码逻辑如下: 1. 首先检查传入的组件名称(components_name)是否在白名单字典(subsystem_components_whitelist_info)的键中。如果在,直接返回(不做任何处理)。 2. 如果不在白名单中,则构造一个字符串`overrided_components_name`,格式为“组件名_override”(这是为了检查是否有重写的组件)。 3. 然后检查组件名称(或重写的组件名称)是否在部件子系统组件信息(part_subsystem_component_info)的键中: a. 如果存在,则进一步检查: - 如果传入的子系统名称(subsystem_name)在部件子系统组件信息字典的值中,则直接返回(表示配置正确)。 - 如果子系统名称和组件名称相同,也直接返回(可能表示子系统自身就是组件?)。 - 如果以上都不满足,则记录错误信息:找不到子系统(name设为subsystem_name,message提示在配置文件中检查该子系统)。 b. 如果组件名称(包括重写形式)也不在part_subsystem_component_info的键中,则记录错误信息:找不到组件(name设为components_name,message提示在配置文件中检查该组件)。 4. 最后,根据上面记录的错误信息中的name是否在子系统组件列表(subsystem_components_list)中: - 如果在,则打印警告(Warning)信息。 - 如果不在,则抛出异常(Exception),提示错误信息。 注意:这个函数的主要目的是验证组件和子系统的配置关系,确保每个组件要么在白名单中,要么在部件配置信息中正确关联了子系统。 但是,这段代码存在一些潜在问题或可以优化的地方: 1. 多次使用`list(...)`转换字典的键,其实可以直接用`in`判断(Python中字典的`in`操作符可以直接用于键,不需要转换成列表,这样更高效)。 2. 错误信息可能不够明确,特别是在判断条件上。 3. 如果同时满足多个条件,可能逻辑不够清晰。 现在,我们尝试重构这段代码,使其更清晰高效(保持原有逻辑不变): </think> 这段代码用于校验子系统(subsystem)和组件(component)的配置关系,主要检查组件是否合法配置在正确的子系统中。以下是逐行解析: ```python def compare_subsystem_and_component( subsystem_name, # 当前子系统名称 components_name, # 需要检查的组件名称 subsystem_components_whitelist_info, # 白名单字典(允许跳过的组件) part_subsystem_component_info, # 部件配置信息字典(组件->子系统映射) parts_config_path, # 配置文件路径(用于错误提示) subsystem_components_list # 有效的子系统组件列表 ): name = "" message = "" # 1. 如果组件在白名单中,直接跳过检查 if components_name in list(subsystem_components_whitelist_info.keys()): return # 2. 检查组件是否存在(包括带_override后缀的版本) overrided_components_name = f"{components_name}_override" component_exists = ( components_name in part_subsystem_component_info.keys() or overrided_components_name in part_subsystem_component_info.keys() ) if component_exists: # 3. 检查组件是否配置在当前子系统 if subsystem_name in part_subsystem_component_info.values(): return # 4. 特殊规则:子系统名和组件名相同则跳过 if subsystem_name == components_name: return # 5. 组件存在但未配置在当前子系统 name = subsystem_name message = f"find subsystem {subsystem_name} failed, please check it in {parts_config_path}." else: # 6. 组件根本不存在 name = components_name message = f"find component {components_name} failed, please check it in {parts_config_path}." # 7. 根据错误级别处理:警告或异常 if name in subsystem_components_list: print(f"Warning: {message}") # 名称在有效列表中则警告 else: raise Exception(message) # 否则抛出异常终止程序 ``` ### 核心校验逻辑: 1. **白名单优先**:在白名单中的组件直接跳过检查 2. **组件存在性检查**: - 检查原始组件名或带`_override`后缀的组件名是否存在 - 若不存在 → 标记为"组件不存在"错误 3. **子系统归属检查**: - 若组件存在 → 检查其是否配置在当前子系统中 - 未配置 → 标记为"子系统配置失败"错误 - 特殊规则:当子系统名与组件名相同时自动通过 4. **分级错误处理**: - 错误组件名在有效组件列表中 → 打印Warning - 错误组件名不在有效列表中 → 抛出Exception终止程序 ### 典型应用场景: - 在硬件配置系统中验证: - 组件(如`sensor_camera`)是否属于当前子系统(如`vision_system`) - 配置文件路径`parts_config_path`用于定位错误配置位置 - 白名单处理特殊豁免组件 ### 优化建议: 1. 避免重复转换`list(dict.keys())`,直接使用`in dict`更高效 2. 使用自定义异常替代通用`Exception` 3. 添加类型注解提高可读性
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值