2014-12-03 73 views
0

所以我有一個類:爲什麼不能投射?

public static class AVLTreeNode <E extends Comparable<E>> extends BST.TreeNode<E> { 
    protected int height; 

    public AVLTreeNode(E e) { 
     super(e); 
    } 
} 

擴展另一個類:

public static class TreeNode<E extends Comparable<E>> { 
    protected E element; 
    protected TreeNode<E> left; 
    protected TreeNode<E> right; 

    public TreeNode(E e) { 
     element = e; 
    } 
} 

而且我創造TreeNode類型的ArrayList,並試圖將它轉換爲AVLTreeNode

public void balancePath(E e) { 
    ArrayList<TreeNode<E>> path = path(e); 
    for (int i = path.size() - 1; i >= 0; i--) { 
     AVLTreeNode<E> a = (AVLTreeNode<E>)(path.get(i)); 
    //continued code not important... 

請注意我的路徑方法返回類型TreeNode<E>ArrayList。但是,當我嘗試將我在列表中的位置i處獲得的節點投射到AVLTreeNode<E>TreeNode的子類型)時,我得到ClassCastException

這裏有什麼問題?

編輯以下是完整的堆棧跟蹤

Exception in thread "main" java.lang.ClassCastException: com.jeffsite.chapter27.BinarySearchTree$TreeNode cannot be cast to com.jeffsite.chapter29.AVLTree$AVLTreeNode 
at com.jeffsite.chapter29.AVLTree.balancePath(AVLTree.java:102) 
at com.jeffsite.chapter29.AVLTree.insert(AVLTree.java:19) 
at com.jeffsite.chapter29.TestAVLTree.main(TestAVLTree.java:10) 
+0

考慮提供一個[可運行示例](https://開頭計算器.com/help/mcve),它可以證明你的問題。這將導致更少的混淆和更好的響應 – MadProgrammer 2014-12-03 05:27:01

+0

發佈您的整個異常,包括堆棧跟蹤。 – 2014-12-03 05:30:14

回答

0

這取決於什麼道路的回報。如果路徑方法/ func返回一個TreeNode列表,那麼轉換是不可能的,因爲AVLTreeNode具有額外的參數。

您可以創建ArrayList或列表AVLTreeNode,它應該有助於解決手頭上的問題(只有在路徑(方法)返回相同的情況下)。

ArrayList<AVLTreeNode<E>> path = path(e); 
+0

path返回一個TreeNode類型的ArrayList – Backwardsman 2014-12-03 05:37:08

+1

所以在這種情況下,轉換會導致問題。由於每個AVLTreeNode都是TreeNode,但不是其他方式。 – 2014-12-03 05:39:13

1

這是不投,因爲它是真實的,每一個AVLTreeNodeTreeNode一個安全的事情,但它不一定是真正的每個TreeNodeAVLTreeNode。您可以將您的List僅持有AVLTreeNode(S),由

ArrayList<TreeNode<E>> path = path(e); 

List<AVLTreeNode<E>> path = path(e); 

我,你應該編寫一個接口改變(這就是爲什麼List代替ArrayList),所以我認爲你真的想要

List<TreeNode<E>> path = path(e); 

然後你可以使用

TreeNode<E> a = path.get(i); 

如果你一定要知道

if (a instanceof AVLTreeNode) { 
    // now you can cast a 
AVLTreeNode<E> b = (AVLTreeNode<E>) a; 
} 
+1

AHA!它的工作..非常感謝你!我只是檢查確保a是AVLTreeNode的一個實例。然後我創建了b並將其用於我的操作.. – Backwardsman 2014-12-03 05:46:19

0

您可以顯示路徑的方法,這種假設法的工作原理:

public ArrayList<? extends TreeNode<E>> path(E e) { 
     AVLTreeNode<E> tn = new AVLTreeNode<E>(e); 
     ArrayList<AVLTreeNode<E>> list = new ArrayList<AVLTreeNode<E>>(); 
     list.add(tn); 
     return list; 
    } 
相關問題