1

宿題に取り組んでいますが、コードを実行しようとするたびにクラス キャスト例外が発生し続ける理由がわかりません。(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 クラスです。

実際の例を変更したので、これらの 2 つのクラスが連携しない理由がわかりません。動作するはずです。ご協力いただきありがとうございます。

4

2 に答える 2

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

于 2013-03-10T17:06:49.783 に答える
1

あなたの変数pathはのArrayListですBSTNodeND。要素を取得すると、それを にキャストしようとしていAVLTreeNodeます。つまり、リストに「子」要素しかない場合に機能する可能性がある子クラスに親クラスをキャストしようとしていますが、オブジェクトのタイプがBSTNodeND特殊なサブクラスにキャストできない場合ですAVLTreeNode

于 2013-03-10T17:08:35.567 に答える