泛型和向下转换(java)

时间:2012-05-05 20:05:56

标签: java generics classcastexception

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

3 个答案:

答案 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的实例,一切都应该正常。

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