java - 覆盖接口(interface)默认方法

标签 java oop inheritance

我在使用以下代码时遇到了一些问题:

接口(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<?> .这意味着您重载了该方法,而不是覆盖它。

您可以执行以下操作之一:

  1. 更改接口(interface)方法的签名以匹配。

    public default Integer countUOW(List<?> args) {
        return 1;
    }
    
  2. 更改实现类方法的签名以匹配。

    @Override
    public Integer countUOW(Object args) {
        for (Object arg : (List<?>) args) {
            total += uowProcessor.countUOW(arg);
        }
    
        return total;
    }
    
  3. 使接口(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/

相关文章:

java - 如何使用 JNA 从结构中获取 Structure.ByReference?

oop - 是否使用 has-a(组合)或 is-a(继承)对汽车对象(及其部件,如引擎)进行建模?

c# - 适配包含 ref 参数的 C# 事件

C++ - 参数由基类的构造函数使用的构造函数

java - 当应用程序部署在 Eclipse 外部时,调用 JSP 文件会出现 NoSuchMethodError

java - 此处不要包含 android.R;为每个用法使用完全限定名称

java - 需要关于适当的类设计的建议

javascript - 使用 Object.create(null) 创建对象时 __proto__ 如何工作

java - 设计模式 : Lazy Singleton, 泛型和继承 : java. lang.Class 无法转换为 java.lang.reflect.ParameterizedType

java - 如何将一堆照片同步到 firebase