所以我有一个班级:
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
答案 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;
}