【发布时间】:2018-10-29 09:01:09
【问题描述】:
我正在开发一个关于二叉搜索树的 Java 项目。我们被要求实现和 AVL 树,但也建议保持良好的抽象以实现其他类型的树(例如红黑树)。我决定使用abstract BsNode 类(Bs = 二进制搜索)和abstract BsTree 类,并通过以下方式使用AvlTree 和AvlNode 实现它们:
public abstract class BsNode<T extends BsNode> {
T parent
T left
T right
...
}
public abstract class BsTree<T extends BsNode> {
T root
...
}
public class AvlNode extends BsNode<AvlNode> {
int balance;
...
}
public class AvlTree<AvlNode> {
private void rotate(int direction);
...
}
这会导致两个问题:首先,BsNode 需要接收它的继承者类型对我来说没有意义。其次,这为这种事情的发生提供了可能性:
public class RedBlackNode extends BsNode<AvlNode> {
...
}
或
RedBlackNode myRoot = new RedBlackNode<AvlNode>();
这些不应该被允许。如何强制使用 BsNode 中的继承类(意味着保留 parent 和子指针指向正在实现该类的类型)而不是传递 T 泛型变量?
【问题讨论】:
-
BsNode<T extends BsNode<T>>。否则它是一个原始类型。 -
你不能禁止滥用,只能让它变得更难。
-
@AndyTurner 但这仍然不能阻止
public class RedBlackNode extends BsNode<AvlNode>的情况,并且在引用this时还需要(T)向下转换。 -
不,它不需要投射任何东西。
-
BsNode有一个递归的T containsNode(int searchVal)方法。假设找到该值,我想返回this(作为包含给定值的节点),但this指的是BsNode<T>而不仅仅是T。
标签: java oop generics inheritance tree