2013-03-10 56 views
1

我正在做家庭作业,我无法弄清楚为什么每当我尝试运行我的代码时都会收到类转换异常。我认为这是由于(path.get(i)),但我似乎无法找出一种方法来解决它。我收到的错误是在Java中使用泛型时生成的类演员异常

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类。

我不明白为什么这两个类不能一起工作,因为我改变了一个工作示例,它应该工作。感谢您的任何帮助,您可以提供。

+2

错误可能是在您的插入逻辑创建'BSTNodeND'时应该创建一个'AVLTreeNode',但您没有给我们这个代码。 – 2013-03-10 17:06:50

回答

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

您的变量pathBSTNodeNDArrayList。当你得到一个元素时,你试图将它投入AVLTreeNode。那就是你试图将父类转换成子类,如果你的列表中只有“子元素”,但是如果对象的类型是BSTNodeND那么你不能将它转换为它的专用子类AVLTreeNode

+0

非常感谢您的帮助。我能够将AVLTreeNode全部删除,只需将一个高度参数添加到我的BSTNodeND。没有更多的流浪儿童! – Jeremy 2013-03-10 17:43:47