我是来自PHP背景的Java新手,如果这很明显,对不起。我正在尝试实现一个二叉树类,并且已经创建了一个如下的ADT:

public abstract class BTree<T> {
    private T value;
    private BTree<T> leftChild;
    private BTree<T> rightChild;
    private BTree<T> parent;
    public BTree<T> getLeftChild() { return this.leftChild; }
    ....
}

然后,我有另一个类将其扩展为:
public class BIntTree extends BTree<Integer> {
}

但是我希望能够在BIntTree中拥有一种可以调用this.getLeftChild();并获取BIntTree实例而不是BTree<Integer>实例的方法

使用某种定义通用类/方法的方法是否可行,或者在我使用this.getLeftChild()甚至重写超类方法后是否必须显式地类型转换?

我当前的解决方案是在BIntTree方法中使用BIntTree b=(BIntTree) this.getLeftChild();显式地进行类型转换,这对我来说似乎很麻烦。

另外,我不确定如果定义了类型转换并且getLeftChild()返回null,会抛出异常吗?如果是这样,鉴于null也是一个有效值(如果存在),我该如何解决?

最佳答案

可以有一个自定义类,但是您必须想知道为什么要这样。为什么您需要知道它是BIntTree而不是BTree<Integer>?使用泛型有什么收获?

无论如何,您可以执行以下操作:

public abstract class BTree<V, T extends BTree<V, T>> {
    public T getLeft() {...}
    public T getRight() {...}
    public V getValue() {...}
}

然后你的BIntTree将是
public class BIntTree extends BTree<Integer, BIntTree> {
    //...
}

编辑

关于您有关强制转换null的问题,实际上没有什么可以阻止您自己测试行为。但是要回答您的问题,可以将null强制转换为任何类型都是安全的。

10-06 12:49