2013-03-10 2 views
1

숙제를하고 있는데 코드를 실행하려고 할 때마다 클래스 캐스트 예외가 계속 발생하는 이유를 알 수 없습니다. 나는 그것이 (path.get (i)) 때문이라고 생각하지만, 그것을 해결할 방법을 찾지 못하는 것 같습니다. 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

삽입 논리에 'AVLTreeNode'를 생성해야 할 때 오류가 발생하여 'BSTNodeND'가 생성되지만이 코드를 제공하지 않았습니다. –

답변

1

객체의 실제 실행시의 형태가 인 경우에, 당신이 당신이에 BSTNodeND의 인스턴스를 캐스팅, 일을 정확히 무엇

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! 
    } 
} 

예를 들어, 서브 클래스 B로 캐스팅 할 수는 서브 클래스, AVLTreeNode.

1

변수 pathArrayListBSTNodeND입니다. 원소를 얻으면 원소를 AVLTreeNode으로 형 변환하려고합니다. 부모 클래스를 자식 클래스로 캐스팅하려고합니다. 목록에 자식 요소가있는 경우에만 작동하지만 개체 유형이 BSTNodeND 인 경우 특수 하위 클래스 AVLTreeNode으로 캐스팅 할 수 없습니다.

+0

도움을 주셔서 대단히 감사합니다. AVLTreeNode를 제거하고 BSTNodeND에 높이 매개 변수를 추가 할 수있었습니다. 더 이상 배회하는 어린이는 없습니다! – Jeremy

관련 문제