在Java中使用泛型时生成的类强制转换异常
我正在做一个家庭作业,我不明白为什么每次我试图运行代码时都会出现类强制转换异常。我认为这是由于(path.get(I))的原因,但我似乎无法找到解决方法。我收到的错误是在Java中使用泛型时生成的类强制转换异常,java,generics,arraylist,avl-tree,Java,Generics,Arraylist,Avl Tree,我正在做一个家庭作业,我不明白为什么每次我试图运行代码时都会出现类强制转换异常。我认为这是由于(path.get(I))的原因,但我似乎无法找到解决方法。我收到的错误是 Exception in thread "main" java.lang.ClassCastException: avltreend.BinarySearchTreeND$BSTNodeND cannot be cast to avltreend.AVLtreeND$AVLTreeNode at avltreend.A
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));
private void balancePath(kd){
ArrayList路径=路径(d);
对于(int i=path.size()-1;i>=0;i--){
//System.out.println(路径);
AVLTreeNode A=(AVLTreeNode)(path.get(i));
findheight(A);
AVLTreeNode POA=(A==根)?空:
(AVLTreeNode)(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);
}
类BSTNodeND>{
L数据;
BSTNodeND左、右、父节点;
BSTNodeND(ld){data=d;}
BSTNodeND(ld,BSTNodeND p){data=d;parent=p;}
公共字符串toString(){
返回data.toString();}//end-toString方法
}
受保护类AVLTreeNode如果对象的真实运行时类型是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!
}
}
这正是您正在做的,将bstNode
的实例强制转换为其子类,AVLTreeNode您的变量path
是bstNode
的ArrayList
。当您得到一个元素时,您正试图将其强制转换为AVLTreeNode
。也就是说,您正试图强制转换父c如果你只有一个“孩子”,你就可以进入儿童班元素,但如果对象的类型为bstnoded
,则无法将其强制转换为其专用子类AVLTreeNode
。错误可能是在创建bstnoded
的插入逻辑中,此时它应该创建AVLTreeNode
,但您尚未提供该代码。非常感谢您的支持我们的帮助。我可以一起删除AVLTreeNode,只需在我的BSTNodeND中添加一个高度参数。不再有流浪儿童!