2012-05-05 56 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到覆蓋任何東西。