在过去的3个小时里一直想找到一个直接的答案/解决方案而没有运气,希望你们能帮忙:
我有以下类使用二叉搜索树实现间隔树:
public class Node<T extends Comparable<T>> implements Comparable<Node<T>> {...}
public class BinarySearchTree<T extends Comparable<T>> {
protected Node<T> root;
...}
public class IntervalNode extends Node<Interval> {...}
public class IntervalTree extends BinarySearchTree<Interval> {...}
当我在IntervalTree实例的根成员上尝试以下强制转换时,我得到一个ClassCastException:
IntervalNode CurrentNode = (IntervalNode)root; //root being of type Node<Interval>
which IntervalNode extends.
我对java很新,但是根据我的阅读和Google搜索,这种向下转换应该是可能的,所以我很遗憾这个异常的原因。到目前为止,我最好的猜测是,这是由类型擦除引起的,但我还没有找到关于此事的直接答案。有关此异常原因的任何想法或更好的解决方法吗?
答案 0 :(得分:7)
你不是在这里向上倾倒,而是向下倾斜。 IntervalNode是Node<Interval>
(因为它扩展了它),但Node<Interval>
不一定是IntervalNode。
正如香蕉是一种水果,因为它延伸它,但水果并不总是香蕉。如果你有一个水果并把它扔到香蕉,它只有在水果实际上是香蕉时才会起作用。如果是苹果,它就会失败。
答案 1 :(得分:1)
如果IntervalNode
中需要IntervalTree
,那么如何:
public class BinarySearchTree<T extends Node<?>> {
protected T root;
}
public class IntervalTree extends BinarySearchTree<IntervalNode> {
}
答案 2 :(得分:0)
如果你使Node
成为一个接口(并且可能将常见的实现放在基类中),那么你几乎可以完全按照你想要做的那样做:
public interface Node<T extends Comparable<T>> extends Comparable<Node<T>> {...}
public class BaseNode<T extends Comparable<T>> implements Node<T> {...}
public class IntervalNode extends BaseNode<Interval> implements Node<Interval> {...}
只要您让所有Node
IntervalTree
使用IntervalNode
的实例,一切都应该正常。
无论哪种方式(有或没有接口),您都需要确保覆盖BinarySearchTree
中Node
创建IntervalTree
以创建IntervalNode
的任何内容。