所以我有一堂课:

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;
    }
}


我正在创建类型为ArrayListTreeNode,并尝试将其强制转换为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...


请注意,我的path方法返回类型为ArrayListTreeNode<E>。但是,当我尝试将列表中位于位置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)

最佳答案

强制转换不是安全的事情,因为每个AVLTreeNode都是TreeNode是正确的,但是每个TreeNode都是AVLTreeNode不一定是正确的。您可以将List仅保留AVLTreeNode,方法是将

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;
}

关于java - 为什么不投?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27264255/

10-09 19:45