我很困扰以下代码无法正常运行:
接口:
public interface UOWProcessor {
public default Integer countUOW(Object args) {
return 1;
}
}
实施:
public class ListUOWProcessor implements UOWProcessor {
private Integer total;
@Autowired
private UOWProcessor uowProcessor;
@Override
public Integer countUOW(List<?> args) {
for (Object arg : args) {
total += uowProcessor.countUOW(arg);
}
return total;
}
}
编辑:添加第二个实现以澄清意图
public class MapUOWProcessor implements UOWProcessor {
private Integer total;
@Autowired
private UOWProcessor uowProcessor;
@Override
public Integer countUOW(Map<?, ?> args) {
for (Object item : args.values()) {
total += uowProcessor.countUOW(item);
}
return total;
}
}
问题在于 @Override 注释会出现错误,显示“该方法未覆盖其超类的任何方法”。这是 Java 11。请问正确的语法是什么?
以下是我尝试用英语表达的内容,如果上面不够清楚:
另一个类将调用接口方法 countUOW(类型未知的对象)。
如果存在该类型对象的接口实现(例如,List 的 ListUOWProcessor、Map 的 MapProcessor),则会调用实现并迭代返回总数(基本上是对象计数)。这将递归调用以考虑嵌套的数组/列表。
如果不存在实现,则可以假定传递的对象是某些非特定对象,然后将其计数为1。
对于原始方法调用,我们应返回传递的父对象中所有对象的计数,包括嵌套数组或映射中的对象。
我也可以从接口中删除“default”单词,并创建一个执行相同操作的 ObjectUOWProcessor - 但我担心它可能优先于其他所有实现,因为 List、Array、Map 都是 Object 的扩展。
编辑:我理解现在这不是 Override,而是 Overload。没有 @Override 注释的代码是否能实现所述功能?
List<?> list = (List<? extends Object>) arg0;
- J. LengelInteger countUOW(Object args)
不等同于Integer countUOW(List<?> args)
。 - user85421