Vij*_*van 3 multiple-inheritance java-8 default-method
问题:
我们知道Java不允许扩展多个类,因为它会导致Diamond问题,编译器无法决定使用哪个超类方法.使用接口默认方法,Diamond问题在Java 8中引入.也就是说,因为如果一个类实现两个接口,每个接口定义相同的默认方法,并且实现类不会覆盖常见的默认方法,则编译器无法决定选择哪个实现.
解:
Java 8需要提供由多个接口实现的默认方法的实现.因此,如果一个类实现上面提到的两个接口,它将不得不为常见的默认方法提供一个实现.否则编译器会抛出编译时错误.
题:
通过重写子类引入的常用方法,为什么此解决方案不适用于多类继承?
您没有正确理解钻石问题(并且授予,维基百科文章的当前状态不能充分解释).如图所示,
当同一个类通过不同的继承路径多次继承时,会出现菱形问题.这对接口来说不是问题(而且从来没有),因为它们只定义了一个契约并且多次指定相同的契约没有区别.
主要问题与方法无关,而是超级类型的数据.A在这种情况下,实例状态应该存在一次还是两次?如果一次,C并且B可以对A实例状态有不同的冲突约束.两个类也可能假设完全控制A状态,即不考虑具有相同访问级别的其他类.如果具有两种不同的A状态,则对D参考的A参考的扩展转换变得模糊,因为任何一种A都可以表示.
接口没有这些问题,因为它们根本不携带实例数据.他们的方法总是(几乎)没有可访问性问题public.允许default方法不会改变它,因为default方法仍然不访问实例变量但仅使用接口方法操作.
当然,有可能B并且C声明default具有相同签名的方法,导致必须解决的歧义D.但即便如此,当没有A,即根本没有"钻石"时.所以这种情况不是"钻石问题"的正确例子.