Java和Diamond问题的新实例(?)

时间:2019-05-26 19:08:07

标签: java diamond-problem

让我们说我有一个名为HasSize的接口,其中包含一个名为int[] manuallyComputedSizes()的方法。

现在,让我们创建两个名为AbstractTreeSequence的子接口,然后创建一个名为BST的类,同时实现AbstractTreeSequence。这是经典的钻石问题。

经典的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>>

有人可以解决吗?

1 个答案:

答案 0 :(得分:1)

Java没有钻石问题。钻石问题只能在支持多重继承的语言中发生,在相同语言中,可以在具有公共接口或超类的两个超类中以不同的方式实现同​​一方法。在Java中,层次结构树中总是存在任何给定方法的具体实现。