2016-10-28 4 views
0

キャスティングリスト<T>リスト<文字列>です。 listの任意の要素に対するgetClass()メソッドは、Listの要素の実際のクラス、つまりStringではなくTを返します。リストは文字列のリストにキャストされたので、Javaは実際のクラスの代わりにStringを返すべきではありませんか?キャスティングリスト<T>リスト<String>タイプ

public cast (List<?> unsortedList) { 
    List<String> unsortedListOfPrimitives = (List<String>)unsortedList; 
    System.out.println(unsortedListOfPrimitives.get(0).getClass()); 
} 


cast(List<BigDecimal> unsortedList); 

Output : java.math.BigDecimal 
+1

キャスティングは、C++とは異なり、Javaではオブジェクトを変更しません。タイプTが "String"であることをJavaに伝えるだけです。あなたが 'List aList = new List ()'を持っていて、後で 'List sList =(List )aList;'、 'sList'が同じオブジェクトならば、あなたはその型を間違えてしまいました。 –

+0

具体的な例を挙げれば助けになります。 –

+0

ありがとう、トーマス。私は例を含めるために質問を編集しました。 –

答えて

1

Javaジェネリックは期待通りに機能しません。

具体的には、ジェネリックを特定のタイプにキャストしてもオブジェクトが実際に変更されるわけではありません。このとき、安全ではない結果が得られます。

List<String>にキャストしたオブジェクトは、実際にはまだBigDecimalのエントリを含むリストであり、誤ってキャストしています。

これは、Javaが入力し、安全でない場合である - IntegerObjectをキャストする型安全ではない(ですが、一般的なキャストはありませんが、実行時に、危険なObjectIntegerへのキャストは、キャストの時に失敗すると同じように遅くなるまで失敗します。

+0

コンパイル時の警告を無視するのは危険です。 – shmosel

関連する問題