8t1*_*081 2 java oop inheritance
我在使以下代码工作时遇到了一些麻烦:
界面:
public interface UOWProcessor {
public default Integer countUOW(Object args) {
return 1;
}
}
Run Code Online (Sandbox Code Playgroud)
执行:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:添加第二个实现以阐明意图
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;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是@Override 注释给出了一个错误,说the method does not override a method from its superclass. 这是 Java 11。它的正确语法是什么?
如果从上面看不清楚,这就是我想用英语做的事情:
另一个类将调用接口方法 countUOW(Object of unknown type)。
如果存在该对象类型的此接口的实现(例如,ListUOWProcessor 用于列表,MapProcessor 用于地图),则该实现将被调用并迭代并返回总数(基本上是对象的计数)。这被递归调用以说明嵌套数组/列表。
如果不存在实现,我们可以假设传递的对象是一些非特定对象,然后计数为 1。
对于方法的原始调用,我们应该返回传递的父对象中所有对象的计数,包括嵌套数组或映射中的对象。
我也可以从接口中删除“默认”这个词,然后创建一个执行相同操作的 ObjectUOWProcessor - 但是我担心它可能优先于所有其他实现,因为 List、Array、Map 都是 Object 的扩展。
编辑:我知道这不是覆盖,现在,而是过载。没有@Override 注释的代码能否实现所描述的功能?
你做得很好,包括@Override注释。因此,编译器通知您您没有正确覆盖该countUOW方法。参数类型不同——接口方法采用 an Object,实现类方法采用List<?>。这意味着您已经重载了该方法,而不是覆盖了它。
您可以执行以下操作之一:
更改接口方法的签名以匹配。
public default Integer countUOW(List<?> args) {
return 1;
}
Run Code Online (Sandbox Code Playgroud)更改实现类方法的签名以匹配。
@Override
public Integer countUOW(Object args) {
for (Object arg : (List<?>) args) {
total += uowProcessor.countUOW(arg);
}
return total;
}
Run Code Online (Sandbox Code Playgroud)使接口通用并让实现类提供类型作为参数。
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;
}
}
Run Code Online (Sandbox Code Playgroud)请注意,这些都与您的方法是default. 您会得到相同的错误,使用相同的选项来解决问题,无论它是默认方法还是抽象方法,以及被覆盖的方法是在接口、抽象类还是具体类中。