2012-05-05 55 views
1

一直试图找到这对于没有运气过去3小时直接的答案/解决方案,希望你们能帮助:泛型和向下转换(JAVA)

我有实现使用的间隔树下面的类二叉搜索树:

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,但从我读过的和谷歌搜索这应该是可能的,所以我有点失去了这种例外的原因。我迄今为止的最佳猜测是,这是由类型删除引起的,但我一直无法找到关于此问题的直接答案。任何关于这个例外或更好的解决办法的想法?

+1

从你的代码中,每个'IntervalNode'都是'Node',但'Node'可能是'IntervalNode'(不是每一个)。当你在你的树中插入一个项目时,它会是一个'Node',可能做的事情就像'if(root == null)root = new Node();'如果是这样的话,那么你的类型转换总是无效的。 –

回答

7

你不是在这里倒立,而是向下倾斜。 IntervalNode是Node<Interval>(因为它扩展了它),但Node<Interval>不一定是IntervalNode。

正如香蕉是一种水果,因为它延伸了它,但水果并不总是香蕉。如果你有一种水果并将它投掷到香蕉上,它只有在水果实际上是一根香蕉时才会起作用。如果它是一个苹果,它会失败。

+0

是的,我刚刚意识到我应该说,下调我会编辑的问题,谢谢你的头。 – Alon

+0

再次感谢我刚刚意识到我的错误。 – Alon

1

如果您需要在您的IntervalTreeIntervalNode,那么怎么样:

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

public class IntervalTree extends BinarySearchTree<IntervalNode> { 

} 
+0

没有想到,可能会救我一些工作,谢谢! – Alon

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实例。

无论哪种方式(有或无接口),你需要确保在BinarySearchTreeIntervalTree创建Node s到创建IntervalNode s到覆盖任何东西。