2014-12-03 74 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; 
    } 
相关问题