我是来自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
强制转换为任何类型都是安全的。