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

标签 java

<分区>

为什么 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.ObjecttoString 方法的默认实现时,您会引入歧义,因为任何类实现您的接口(interface)也将以一种或另一种方式从 Object 继承,因此编译器需要在两种实现之间做出决定(尽管您试图通过 @override< 告诉编译器这一事实 您希望默认实现获胜的属性)。为了解决这种歧义,编译器会要求所有实现 SomeInterface 的类也覆盖 toString。但是,这意味着永远不会使用默认实现。因此,该语言首先禁止提供它。

关于java - 为什么不允许将 toString() 作为默认方法添加到接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24595266/

相关文章:

javac错误 "code too large"?

java - 如何使用 java 程序最好地处理数据库中的简单列替换?

java - 安卓加速度计

java - HSQLDB 将大型数据库从 1.8 升级到 2.4.1 超时

java - 可视化递归

java - 如何获取公共(public)存储路径?外部存储(非 SD 卡)

Java:如何访问内部类自己的类型

java.lang.OutOfMemoryError : unable to create new native thread ..在Windows中重新创建

java - 错误:发生了JNI错误。线程 “main” java.lang.VerifyError中的异常。该位置的预期堆栈图框架

java - Jni native C++ 在 android 中并不比 java 快