Java 为什么不允许将toString()作为默认方法添加到接口?
为什么Java 8不允许在接口中添加toString()的默认实现Java 为什么不允许将toString()作为默认方法添加到接口?,java,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
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 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()
;否则该类将无法编译
类似地,当在接口中提供
java.lang.Object
的toString
方法的默认实现时,会引入歧义,因为实现接口的任何类也会以某种方式从对象继承,因此,编译器需要在两种实现之间做出决定(尽管您试图通过@override
属性告诉编译器您希望默认实现获胜)。为了解决这种歧义,编译器将要求实现SomeInterface
的所有类也重写toString
。但是,这意味着永远不会使用默认实现。因此,该语言首先禁止提供该链接。@marounnaroun感谢您的链接。