2016-11-03 1 views
-1

ClassCastExceptionを理解するのに苦労していますが、コメントされている行がクラッシュしています。なぜそのことを説明してください?おかげClassCastExceptionを別のオブジェクトで処理する

public class tester { 

    private static B<Data> build(char[] ss, double[] f) { 

     B<Data> res = new B<Data>(); 

     PriorityQueue<String> q = new PriorityQueue<String>(); 
     ... 
     double c_x = 20.1; 

     Data h = res.getElement(); //throws ClassCastException 

     if(h.getFreq()==c_x){ 
      ... 
     } 
    }//end of method 
}//end of class tester 

public class Data{ 

    private char symbol; 
    private double freq; 

    public Data(char c, double f){ 
     symbol = c; 
     freq = f; 
    } 

    public char getSymbol(){ 
     return symbol; 
    } 

    public double getFreq(){ 
     return freq; 
    } 

    public String toString(){ 
     return freq + ":" + symbol; 
    } 

    public int compareTo(Data o) { 
     return (int) (this.freq-o.freq); 
    } 
}//end of class Data 

public class B<T> { 

    // the fields 
    private T element; 
    private B<T> left; 
     private B<T> right; 

     // create an empty node 
     public B() { 
      this(null, null, null); 
     } 

     public B(T theElement, B<T> lt, B<T> rt) { 
      element = theElement; 
      left = lt; 
      right = rt; 
     } 

     // return the element 
     public T getElement() { 
      return element; 
     } 
     public void setElement(T x) { 
      element = x; 
     }   

}//end of class B 

例外:

Exception in thread "main" java.lang.ClassCastException: java.lang.Double cannot be cast to Data 
at tester.build(tester.java:40) 
at tester.main(tester.java:83) 
+0

あなたはあなたにも何を得るのエラーメッセージ投稿することができますか?何らかの形で 'Data'ではないオブジェクトが' res'に入りました。 –

+0

スレッド「main」の例外java.lang.ClassCastException:java.lang.Doubleをデータにキャストできません \t tester.build(tester.java:40) \t at tester.main(tester.java:83)My行番号はあなたのものとは異なりますが、クラッシュします。 –

+0

res.getElement()は、DataオブジェクトではないDouble値です。この文脈でBが何であるかはわかりません。あなたはBのgetElement()の実装をチェックし、それが何を返すのか見てみることができますか? –

答えて

0

あなたは、私が実行できる完全なコードを投稿していなかったので、私は自分自身を確認する必要があります。

Data.java:

package test; 

public class Data { 
    private char symbol; 
    private double freq; 

    public Data(char c, double f){ 
     symbol = c; 
     freq = f; 
    } 

    public char getSymbol(){ 
     return symbol; 
    } 

    public double getFreq(){ 
     return freq; 
    } 

    public String toString(){ 
     return freq + ":" + symbol; 
    } 

    public int compareTo(Data o) { 
     return (int) (this.freq-o.freq); 
    } 
} 

GenericType.java(置き換えB):

package test; 

public class GenericType<T> { 
    private T element; 

    public GenericType() { 
     element = null; 
    } 

    public T getElement() { 
     return element; 
    } 

    public void setElement(T x) { 
     element = x; 
    }   
} 

Test.java(メインプログラム)実行

package test; 

public class Test { 

    public static void main(String[] args) { 
     GenericType<Data> obj = new GenericType<Data>(); 
     Data d = obj.getElement();  
     System.out.println("Data retrieved"); 
    } 
} 

> java test.Test 
Data retrieved 

どこかに問題があり、省略しました。 https://stackoverflow.com/help/mcve

ジェネリック医薬品のみコンパイル時のコンセプトである、最小限の完全な、かつ検証例を作成する方法

。実行時にはそれらは単なるオブジェクトです。あなたの問題は、Bをインスタンス化する方法にある可能性が最も高いです。

0

生の型を取るメソッドがあるとしますかB?その場合は、その方法でelementに任意の値を割り当てることができます。

static void rawSet(B b) { 
    b.setElement(1.0); // you can put anything here 
} 

public static void main(String [] args) { 
    B<Integer> b = new B<>(); 
    rawSet(b); 
    Integer x = b.getElement(); // ClassCastException 
} 
関連する問題