gpt4 book ai didi

java-8 - Java 8 没有提供与解决接口(interface)默认方法相同的解决方案来允许多重继承

转载 作者:行者123 更新时间:2023-12-02 02:21:22 35 4
gpt4 key购买 nike

问题:

我们知道 Java 不允许扩展多个类,因为这会导致 Diamond Problem 编译器无法决定使用哪个父类(super class)方法。使用接口(interface)默认方法,菱形继承(钻石问题)Java 8中引入。也就是说,因为如果一个类实现了两个接口(interface),每个接口(interface)都定义了相同的默认方法,并且实现类没有重写公共(public)默认方法,则编译器无法决定选择哪个实现。

解决方案:

Java 8 要求为多个接口(interface)实现的默认方法提供一种实现。因此,如果一个类要实现上述两个接口(interface),它就必须提供公共(public)默认方法的实现。否则编译器会抛出编译时错误。

问题:

为什么这个解决方案不适用于通过重写子类引入的公共(public)方法来实现多类继承?

最佳答案

您没有正确理解菱形继承(钻石问题)(当然,维基百科文章的当前状态并没有充分解释它)。如此图所示,

A true diamond

同一个类通过不同的继承路径被多次继承时,就会出现菱形问题。对于接口(interface)来说这不是问题(而且从来都不是问题),因为它们只定义一个契约,多次指定相同的契约没有区别。

主要问题与方法无关,而是与该父类(super class)型的数据相关。实例状态应该为 A在这种情况下存在一次或两次?如果一次,CB A 上可能有不同的、相互冲突的约束的实例状态。这两个类也可能假设完全控制 A的状态,即不考虑具有相同访问级别的其他类。如果有两个不同的A状态,a D 的扩大转换引用A引用变得不明确,因为 A可能是这个意思。

接口(interface)不存在这些问题,因为它们根本不携带实例数据。他们也(几乎)没有可访问性问题,因为他们的方法始终是 public 。允许default方法,不会改变这一点,如 default方法仍然不访问实例变量,而仅使用接口(interface)方法进行操作。

当然,也有可能是BC声明default具有相同签名的方法,导致歧义,必须在 D 中解决。但即使没有A,情况也是如此。 ,即根本没有“钻石”。所以这个场景不是“菱形继承(钻石问题)”的正确例子。

关于java-8 - Java 8 没有提供与解决接口(interface)默认方法相同的解决方案来允许多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41257107/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com