我在处理树问题时遇到了这个问题:
class BTNode<T> {
private final T value;
private BTNode<T> parent;
private BTNode<T> left;
private BTNode<T> right;
public BTNode(T aValue) {
value = aValue;
left = right = parent = null;
}
the obvious protected getters & setters
}
后来我需要一个子类,它只接受可比较的 T,定义 compareTo,并添加使用该属性的新方法。除了让 Java 满意之外,getter 和 setter 不需要做任何新的事情。
class CBTNode<T extends Comparable<T>> extends BTNode<T>
implements Comparable<CBTNode<T>> {
CBTNode(T aValue) { super(aValue); }
T isBST() .... calls getLeft().isBST() // for example
}
继承通常很简单,但是父类的字段都是类型化的 BTNode 的事实似乎使这比我希望的要困难得多,因为运行时的类转换错误。我可以创建 CBTNodes 对象,但它们的字段仍然是 BTNodes,并在 isBST() 等地方引起问题。getLeft() 返回一个 BTNode,但 isBST 只为 CBTNodes 定义。当我尝试转换为 CBTNode 时,Java 不喜欢它。
扩展/委托/其他 CBTNode 的首选方式是什么?它不是一个大类——我可以切断两个节点之间的链接,并将 CBTNode 定义为 BTNode 的副本,但使用 CBTNode 字段,但这看起来很丑陋。我想过委派新功能,但仍然会遇到从 BTNode 转换为 Java 对象的 CBTNode 的问题。我希望我忽略了一个明显的、优雅的方法,它正等着咬我的鼻子。