2013-03-10 57 views
1

我正在做家庭作業,我無法弄清楚爲什麼每當我嘗試運行我的代碼時都會收到類轉換異常。我認爲這是由於(path.get(i)),但我似乎無法找出一種方法來解決它。我收到的錯誤是在Java中使用泛型時生成的類演員異常

Exception in thread "main" java.lang.ClassCastException: avltreend.BinarySearchTreeND$BSTNodeND cannot be cast to avltreend.AVLtreeND$AVLTreeNode 
    at avltreend.AVLtreeND.balancePath(AVLtreeND.java:64) 
    at avltreend.AVLtreeND.insert(AVLtreeND.java:27) 
    at avltreend.AVLtreeND.TestAVL(AVLtreeND.java:233) 
    at avltreend.AVLtreeND.main(AVLtreeND.java:244) 
Java Result: 1 

某些代碼低於

private void balancePath(K d) { 
    ArrayList<BSTNodeND<K>> path = path(d); 
    for (int i = path.size() - 1; i>= 0; i--) { 
    // System.out.println(path); 
     AVLTreeNode<K> A = (AVLTreeNode<K>)(path.get(i)); 
     findheight(A); 
     AVLTreeNode<K> POA = (A == root) ? null : 
       (AVLTreeNode<K>)(path.get(i - 1)); 

的錯誤似乎高於5日線在運行時出現。

 class BSTNodeND < L extends Comparable< ? super L > > { 
    L data; 
    BSTNodeND <L> left, right, parent; 

    BSTNodeND (L d)     {data = d;} 
    BSTNodeND (L d, BSTNodeND <L> p) {data = d; parent = p;} 

    public String toString() { 
     return data.toString();} // end toString method 
    } 


    protected class AVLTreeNode<L extends Comparable<? super L>> 
     extends BSTNodeND<L> { 
    protected int height = 0; // New data field 

    public AVLTreeNode(L d) { 
     super(d); 
    } 

這就是AVLTreeNode類。

我不明白爲什麼這兩個類不能一起工作,因爲我改變了一個工作示例,它應該工作。感謝您的任何幫助,您可以提供。

+2

錯誤可能是在您的插入邏輯創建'BSTNodeND'時應該創建一個'AVLTreeNode',但您沒有給我們這個代碼。 – 2013-03-10 17:06:50

回答

1

如果一個物體的真實運行時類型爲A,那麼你就不能將它轉換爲一個子類B.例如,

class A {...} 

class B extends A { 
    public void announce() { 
     System.out.println("Hi, I'm an instance of B."); 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     A a = new A(); 
     A b = new B(); 
     ((B) b).announce(); // Valid 
     ((B) a).announce(); // Exception! 
    } 
} 

這是你在做什麼,鑄造BSTNodeND實例其子類,AVLTreeNode

1

您的變量pathBSTNodeNDArrayList。當你得到一個元素時,你試圖將它投入AVLTreeNode。那就是你試圖將父類轉換成子類,如果你的列表中只有「子元素」,但是如果對象的類型是BSTNodeND那麼你不能將它轉換爲它的專用子類AVLTreeNode

+0

非常感謝您的幫助。我能夠將AVLTreeNode全部刪除,只需將一個高度參數添加到我的BSTNodeND。沒有更多的流浪兒童! – Jeremy 2013-03-10 17:43:47