1

在过去的 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 还很陌生,但从我读过和搜索过的内容来看,这种向下转换应该是可能的,所以我对这个异常的原因有点迷茫。到目前为止,我最好的猜测是这是由类型擦除引起的,但我无法找到关于此事的直接答案。关于此异常的原因或更好的解决方法的任何想法?

4

3 回答 3

7

你不是在这里向上转型,而是向下转型。IntervalNode 是 a Node<Interval>(因为它扩展了它),但 aNode<Interval>不一定是 IntervalNode。

就像香蕉是水果一样,因为它扩展了它,但水果并不总是香蕉。如果你有一个水果并将其投射到香蕉上,那么只有当水果实际上是香蕉时它才会起作用。如果它是一个苹果,它就会失败。

于 2012-05-05T20:13:06.097 回答
1

如果你需要一个IntervalNode在你的IntervalTree,那么怎么样:

public class BinarySearchTree<T extends Node<?>> {
    protected T root;
}

public class IntervalTree extends BinarySearchTree<IntervalNode> {

}
于 2012-05-05T20:32:50.520 回答
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> {...}

只要您使所有NodesIntervalTree使用IntervalNode.

无论哪种方式(有或没有接口),您都需要确保覆盖BinarySearchTree创建Nodes 中的任何内容IntervalTree以创建IntervalNodes。

于 2012-05-05T21:49:47.893 回答