为什么不赢这场演员?

时间:2014-12-03 05:25:23

标签: java oop casting tree subclass

所以我有一个班级:

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

我正在创建ArrayList类型TreeNode,并尝试将其投放到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...

请注意,我的路径方法会返回类型为ArrayList的{​​{1}}。但是当我尝试将我在列表中的位置i获得的节点转换为TreeNode<E>AVLTreeNode<E>的子类型)时,我得到TreeNode

这里有什么问题?

编辑这是完整的堆栈跟踪

ClassCastException

3 个答案:

答案 0 :(得分:1)

施放是不安全的,因为每个AVLTreeNode都是TreeNode,但每个TreeNode都是AVLTreeNode并不一定正确。 }。您可以通过更改

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 :(得分:0)

这取决于返回的路径。如果path方法/ func返回TreeNode列表,那么转换是不可能的,因为AVLTreeNode涉及额外的参数。

您可以创建AVLTreeNode的ArrayList或List,这有助于解决手头的问题(仅在路径(方法)返回相同的情况下)。

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

答案 2 :(得分: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;
    }