所以我有一堂课:
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...
请注意,我的path方法返回类型为
ArrayList
的TreeNode<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/