为什么 Java 8 不允许在接口(interface)中添加 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
这样做是为了避免多重继承的问题。
一般规则是一个对象不能继承一个方法的两个实现。此规则适用于多种情况 - 例如,当您尝试实现两个接口(interface)时,它们都具有与默认实现相同的方法:
interface Animal {
default void saySomething() {
System.out.println("Something");
}
}
interface Cat {
default void saySomething() {
System.out.println("Meow");
}
}
class Tiger implements Animal, Cat {
// Restricted
}
你必须覆盖上面的 Tiger
类中的 saySomething()
;否则该类将无法编译。
同样,当您在接口(interface)中提供 java.lang.Object
的 toString
方法的默认实现时,您会引入歧义,因为任何类实现您的接口(interface)也将以一种或另一种方式从 Object
继承,因此编译器需要在两种实现之间做出决定(尽管您试图通过 @override< 告诉编译器这一事实
您希望默认实现获胜的属性)。为了解决这种歧义,编译器会要求所有实现 SomeInterface
的类也覆盖 toString
。但是,这意味着永远不会使用默认实现。因此,该语言首先禁止提供它。