【问题标题】:Diamond issue with common default method in interfaces [duplicate]接口中常见默认方法的菱形问题[重复]
【发布时间】:2018-05-13 15:58:33
【问题描述】:

我试图理解为什么下面的程序无法编译。 两种默认方法的返回类型在两个接口中都不同。 是否应该将它们视为接口 c 中的两种不同方法?

interface a{
    default void log(String str){
        System.out.println("I1 logging::"+str);
    }  
}

interface b {
    default int log(String str){
        System.out.println("I1 logging::"+str);
        return 0;
    }
}

interface c extends a,b{
}

HelloWorld.java:32:错误:类型 b 和 a 不兼容;都定义了 log(java.lang.String),但返回类型不相关接口 c 扩展 a,b{ }

【问题讨论】:

    标签: java jakarta-ee memory-management java-8


    【解决方案1】:

    您的默认实现既不遵循覆盖(维护协变返回类型)也不遵循重载(参数差异)。

    更多信息请参考:

    Covariant return types in Java

    What is a covariant return type?

    【讨论】:

      【解决方案2】:

      根据Java Language Specification

      两个方法或构造函数,M 和 N,如果它们具有相同的签名 具有相同的名称、相同的类型参数(如果有)(第 8.4.4 节),并且, 在将 N 的形式参数类型调整为类型之后 M的形参,形参类型相同。

      您的接口包含具有相同签名的方法(相同的方法名称和参数类型)

      声明两个方法是编译时错误 覆盖类中的等效签名。

      因此你不能在你的类中实现这两个接口。 (确实,编译器不能仅仅通过返回类型_来区分函数)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-25
        • 2018-05-06
        • 1970-01-01
        • 2019-01-28
        • 2017-07-11
        • 2015-01-11
        • 2019-04-02
        • 2018-01-28
        相关资源
        最近更新 更多