Java 为什么不允许将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

为什么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

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

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

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感谢您的链接。