为什么不允许将toString()作为默认方法添加到接口?

时间:2014-07-06 11:19:38

标签: java

为什么Java 8不允许在接口中添加toString()的默认实现?

public interface SomeInterface {
    @Override
    default String toString(){
        return "";
    }
}

这是错误消息:

Error:(8, 20) java: default method toString in interface task1_3.
SomeInterface overrides a member of java.lang.Object

1 个答案:

答案 0 :(得分:20)

这样做是为了避免多重继承问题。

一般规则是对象不能继承单个方法的两个实现。此规则适用于多种情况 - 例如,当您尝试实现两个接口时,两者都具有与默认实现相同的方法:

interface Animal {
    default void saySomething() {
        System.out.println("Something");
    }
}

interface Cat {
    default void saySomething() {
        System.out.println("Meow");
    }
}

class Tiger implements Animal, Cat {
    // Restricted
}

您必须覆盖上述saySomething()课程中的Tiger;否则该课程将无法编译。

同样,当您在接口中提供java.lang.Object的{​​{1}}方法的默认实现时,您会引入歧义,因为实现您的接口的任何类也将继承自{{1}无论如何,编译器需要在两个实现之间做出决定(尽管您试图通过toString属性告诉编译器您希望默认实现获胜)。为了解决这种歧义,编译器将要求所有实现Object的类也覆盖@override。但是,这意味着永远不会使用默认实现。因此,该语言禁止首先提供它。