【问题标题】:Why is it not allowed add toString() to interface as default method? [duplicate]为什么不允许将 toString() 添加到接口作为默认方法? [复制]
【发布时间】:2014-08-27 00:44:24
【问题描述】:

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

【问题讨论】:

标签: java


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-14
    • 2015-02-06
    • 2016-07-28
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 2016-10-06
    相关资源
    最近更新 更多