我正在做一个家庭作业,我无法弄清楚为什么每当我尝试运行我的代码时,我都会继续获得类强制转换异常。我认为这是由于(path.get(i))但我似乎找不到解决方法。我收到的错误是
Exception in thread "main" java.lang.ClassCastException: avltreend.BinarySearchTreeND$BSTNodeND cannot be cast to avltreend.AVLtreeND$AVLTreeNode
at avltreend.AVLtreeND.balancePath(AVLtreeND.java:64)
at avltreend.AVLtreeND.insert(AVLtreeND.java:27)
at avltreend.AVLtreeND.TestAVL(AVLtreeND.java:233)
at avltreend.AVLtreeND.main(AVLtreeND.java:244)
Java Result: 1
部分代码位于
之下 private void balancePath(K d) {
ArrayList<BSTNodeND<K>> path = path(d);
for (int i = path.size() - 1; i>= 0; i--) {
// System.out.println(path);
AVLTreeNode<K> A = (AVLTreeNode<K>)(path.get(i));
findheight(A);
AVLTreeNode<K> POA = (A == root) ? null :
(AVLTreeNode<K>)(path.get(i - 1));
当运行上面的第5行时,似乎出现错误。
class BSTNodeND < L extends Comparable< ? super L > > {
L data;
BSTNodeND < L > left, right, parent;
BSTNodeND (L d) {data = d;}
BSTNodeND (L d, BSTNodeND <L> p) {data = d; parent = p;}
public String toString () {
return data.toString();} // end toString method
}
protected class AVLTreeNode<L extends Comparable<? super L>>
extends BSTNodeND<L> {
protected int height = 0; // New data field
public AVLTreeNode(L d) {
super(d);
}
这就是AVLTreeNode类。
我无法弄清楚为什么这两个类不能一起工作,因为我已经改变了一个工作示例,它应该可以工作。感谢您提供的任何帮助。
答案 0 :(得分:1)
如果对象的真实运行时类型为A,则无法将其强制转换为子类B.例如,
class A {...}
class B extends A {
public void announce() {
System.out.println("Hi, I'm an instance of B.");
}
}
public class Main {
public static void main(String[] args) {
A a = new A();
A b = new B();
((B) b).announce(); // Valid
((B) a).announce(); // Exception!
}
}
这正是您正在做的事情,将BSTNodeND
的实例强制转换为其子类AVLTreeNode
。
答案 1 :(得分:1)
您的变量path
是ArrayList
的{{1}}。当你得到一个元素时,你试图将它转换为BSTNodeND
。也就是说,如果列表中只有“child”元素,但是如果对象的类型为AVLTreeNode
,那么您正在尝试将父类强制转换为可能有效的子类,那么就不能将其强制转换为其专用子类BSTNodeND
。