0

同じ形式で数値の種類が異なるいくつかの文字列 (数値を含む) を解析し、これらの数値を関連する配列に設定したいと考えています。たとえば、次の文字列があります: " "positions":[[35.23,436.34],[23.5, 7.1]] これらの数値を "this" という名前の float 配列に入れたい! この文字列に対して "indices":[[ 23,4],[2,1]]" "that" という名前の整数配列に入れたい!

そのために、次の宣言を使用してジェネリック関数を作成しました。

       private <E extends Number> voidfunc(ArrayList<E> array, String JSON){
       .
       .
       array.add((E) NumberFormat.getInstance().parse(JSON.substring(...)));
       .
       .
       }

これはうまく機能し、数値を配列に正しく入れますが、後で、アプリのどこかで「クラスキャスト例外。Double を Float にキャストできません」というエラーが発生します。

       floatArray[i] = temp.get(i);

temp は float 配列リストとして定義され、上記の関数で満たされています。

なぜそうなのか、どうすれば解決できるのか教えてもらえますか? 本当に感謝しています。

4

2 に答える 2

2

あなたの例でEは、ジェネリック メソッドの型パラメーターです。この型は実行時には不明であるため、この型へのキャスト(E)は偽物であり、コンパイラはこの行で警告を報告した可能性が最も高いです。JVM はこのキャスト中に型の互換性をチェックしないため、互換性のない型の値がリストに含まれる可能性があります。たとえば、Doubletype の値が に格納される場合がありますList<Float>。後で、リストから値を抽出して にキャストしようとするとFloatClassCastExceptionが発生します。

おそらく、次のようにコードを変更する必要があります。

private void func (ArrayList <? super Double> array, String JSON)
{
    ...
    array.add (NumberFormat.getInstance ().parse (JSON.substring (...)));
    ...
}

ArrayList <Number> temp = new ArrayList ();
func (temp, json);
floatArray [i] = temp.get (i).floatValue ();
于 2013-02-25T13:24:49.147 に答える
1

試してみてください:

floatArray[i] = ((Double) temp.get(i)).floatValue();
于 2013-02-25T13:25:59.833 に答える