当前位置: 首页 > 知识库问答 >
问题:

为什么不允许将toString()作为默认方法添加到接口?[副本]

夹谷奇
2023-03-14

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

共有1个答案

田硕
2023-03-14

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

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

interface Animal {
    default void saySomething() {
        System.out.println("Something");
    }
}

interface Cat {
    default void saySomething() {
        System.out.println("Meow");
    }
}

class Tiger implements Animal, Cat {
    // Restricted
}

您必须重写上面的老虎类中的say某物();否则类将无法编译。

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

 类似资料:
  • 我们举个例子: 一个常见的解决方案是转移到一个抽象类,但是在我的具体案例中,我有一个枚举的接口,所以在这里不适用。我想这不是被忽略了,就是因为接口背后的原始想法,即它们是可用方法的“契约”,但我想我需要关于这是怎么回事的输入。 我读过“为什么Java 8接口方法中不允许使用”final“?”,其中说: 默认方法的基本思想是:它是具有默认实现的接口方法,派生类可以提供更具体的实现 与关联问题一样,由

  • 学习Java8默认方法。这个链接就像互联网上的其他资源一样说 在“最严格的意义上”,默认方法是一种倒退,因为它们允许你用代码“污染”你的接口。但它们提供了允许向后兼容的最优雅和最实用的方法。它使Oracle更容易更新所有集合类,也使您更容易为Lambda修改现有代码。 我的理解是Java8Dev/Designers在接口中提供了默认方法,这样所有实现类就不必不必要地重写相同的行为,从而提供了向后兼

  • 问题内容: 让我们举个例子: 很简单,这将打印出来。但是请说我正在使用返回值进行其他操作,例如初始化数据文件并返回不应离开实现类的敏感内部值。为什么Java不允许默认接口方法使用访问修饰符?为什么它们不能被子类保护/私有并可能被提升(类似于_扩展_ 父类的类如何为覆盖的方法使用更可见的修饰符)? 常见的解决方案是迁移到抽象类,但是在我的特定情况下,我具有枚举的接口,因此不适用于此处。我想象它要么被

  • 虽然有些人曾经问过这个问题,但那是在Java8发布之前。 以前,静态成员是不允许的,因为实现细节不能在接口中定义。这也是为什么任何东西都不应该是私有的,因为接口的实现者需要提供实现细节。 Java8改变了这种情况,不是吗?默认方法定义实现细节,静态方法也是如此。那么,为什么仍然不允许这样做呢?

  • 在Java中,不允许多重继承,但是在Java8之后,接口可以有默认方法(可以实现方法本身),就像抽象类一样。在此上下文中,还应该允许it多重继承。

  • 问题内容: Java 8最有用的功能之一是接口上的新方法。引入它们的原因基本上有两个(可能还有其他原因): 提供实际的默认实现。例: 允许JDK API演进。例: 从API设计人员的角度来看,我希望能够在接口方法上使用其他修饰符,例如。在添加便捷方法时,这将很有用,以防止在实现类时“意外”覆盖: 如果已经上过课,以上是已经很普遍的做法: 现在,并且显然是相互矛盾的关键字,但是默认关键字本身并没有严