让我们说我有一个名为HasSize
的接口,其中包含一个名为int[] manuallyComputedSizes()
的方法。
现在,让我们创建两个名为AbstractTree
和Sequence
的子接口,然后创建一个名为BST
的类,同时实现AbstractTree
和Sequence
。这是经典的钻石问题。
经典的Java解决方案是覆盖直接调用两个子接口之一的方法,例如:
@Override
public int[] manuallyComputedSize() {
return AbstractTree.super.manuallyComputedSize();
}
或:
@Override
public int[] manuallyComputedSize() {
return Super.super.manuallyComputedSize();
}
但是,如果我们需要其他东西怎么办?
如果我们假设实现HasSize
的每个类都将有一个名为size
的字段,表示存储的数据量,并且我们希望有一种方法来检查此字段的设置是否正确?如果我们希望用户以所有可能的方式手动计算所述数据量,然后将其与存储的数据进行比较,该怎么办?
在这种情况下,我们将希望获得类似的东西:
public int[] manuallyComputedSize() {
return ArrayUtility.merge(
AbstractTree.super.manuallyComputedSize(),
Sequence.super.manuallyComputedSize());
}
我尝试了此解决方案,并收到以下错误消息:
命名为manualComputedBigSize的默认方法与 参数()和()从类型继承
Sequence<T,NodeBST<T>>
和AbstractTree<T,NodeBST<T>>
有人可以解决吗?
答案 0 :(得分:1)
Java没有钻石问题。钻石问题只能在支持多重继承的语言中发生,在相同语言中,可以在具有公共接口或超类的两个超类中以不同的方式实现同一方法。在Java中,层次结构树中总是存在任何给定方法的具体实现。