钻石问题与接口中的常见默认方法

时间:2018-05-13 15:58:34

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

我试图理解为什么以下程序无法编译。 两种默认方法的返回类型在两个接口中都不同。 它们应该在接口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 {}

2 个答案:

答案 0 :(得分:1)

您的默认实现既不会覆盖(维护共变量返回类型)也不会超载(参数差异)。

有关详细信息,请参阅此处:

Covariant return types in Java

What is a covariant return type?

答案 1 :(得分:1)

根据Java Language Specification

  

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

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

  

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

因此,您无法在类中实现这两个接口。 (实际上,编译器无法仅通过返回type_来区分函数)