为什么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
答案 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
。但是,这意味着永远不会使用默认实现。因此,该语言禁止首先提供它。