我在使用以下代码时遇到了一些问题:
接口(interface):
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 注释给出了一个错误,指出该方法没有覆盖其父类(super class)中的方法
。这是 Java 11。正确的语法是什么?
如果从上面看不清楚,这是我试图用英语做的:
另一个类会调用接口(interface)方法countUOW(Object of unknown type)。
如果对象类型存在此接口(interface)的实现(例如,列表的 ListUOWProcessor, map 的 MapProcessor),然后将调用该实现并迭代并返回总数(基本上是对象的计数)。这被递归调用以说明嵌套数组/列表。
如果不存在实现,我们可以假设传递的对象是一些非特定对象,然后计数为 1。
对于方法的原始调用,我们应该返回传递的父对象中所有对象的计数,包括嵌套数组或映射中的对象。
我也可以从接口(interface)中删除“默认”这个词,只创建一个做同样事情的 ObjectUOWProcessor - 但是我担心它可能优先于所有其他实现,因为 List、Array、Map 都是 Object 的扩展。
编辑:我知道现在这不是覆盖,而是重载。没有@Override注解的代码能实现描述的功能吗?
最佳答案
您很好地包含了 @Override
注解。因此,编译器通知您没有正确覆盖 countUOW
方法。参数类型不同——接口(interface)方法采用 Object
并且实现类方法采用 List<?>
.这意味着您重载了该方法,而不是覆盖它。
您可以执行以下操作之一:
更改接口(interface)方法的签名以匹配。
public default Integer countUOW(List<?> args) { return 1; }
更改实现类方法的签名以匹配。
@Override public Integer countUOW(Object args) { for (Object arg : (List<?>) args) { total += uowProcessor.countUOW(arg); } return total; }
使接口(interface)通用并让实现类提供类型作为参数。
public interface UOWProcessor<T> { public default Integer countUOW(T args) { return 1; } } public class ListUOWProcessor implements UOWProcessor<List<?>> { // ... @Override public Integer countUOW(List<?> args) { for (Object arg : args) { total += uowProcessor.countUOW(arg); } return total; } }
请注意,这与您的方法是 default
没有任何关系。 .无论是默认方法还是抽象方法,以及被重写的方法是在接口(interface)、抽象类还是具体类中,您都会遇到相同的错误,并使用相同的选项来解决问题。
关于java - 覆盖接口(interface)默认方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54467410/