2011-08-05 12 views
2

は、次の簡単なコードを考えてみましょうことができます:Javaのジェネリック - 無制限のワイルドカードは、異なる種類の混合物(警告なし)

List <?> list4[] = { Arrays.asList("1","2"), Arrays.asList(1,2)}; 

を私は無制限のワイルドカードがreifiableタイプであることを理解します。したがって、私は上記の問題が何の問題もなく(なぜなら、未確認の警告なしで)なぜ動作するのか理解しています。

しかし、注意深く見ると、上記のコードで問題が発生します。
アレイにList <string>List <Integer>が混在しています。上記のような特殊な状況には、未確認の警告はありませんか?

List <String> x = list4[0]; 
List <String> y = list4[1]; <-- problem right? 

私は、これはばかげ例である知っているが、それは一般的なコンテナ内のタイプの混合物がある場合、問題が発生した一例に過ぎません。

+0

例もコンパイルしないことが、そのようにそれは問題ではありません。 'y'が導入する論理的な問題については忘れてください。 'x 'の割り当てさえ無効です。 – erickson

+0

@erickson ok。私は今あなたのポイントを見ます。私は光を見ます。 Thx – yapkm01

+0

これらの割り当てが機能するようにするには、 'List 'へのキャストが必要です。これは安全ではないので警告(どちらの割り当ても)を行います。しかし、私は各要素を 'List 'に割り当て、リストの要素を 'Object'として読むことができます。これは便利なことかもしれませんが、混合配列の作成に関する警告は表示されません。 – erickson

答えて

3

なぜ問題ですか?

さらに注意してください:キャストがない場合にはClassCastExceptionが発生し、問題の原因を示すコードを提供してください。たとえ明示的なキャストが使用されていなくても、実行時にコードが型エラーを生成する可能性がある場合、型安全警告が提供されます。提案された割り当ては、コンパイルするためには


、キャストが追加する必要があります。

List<String> x = (List<String>) list4[0]; 

しかし、パラメータ化された型へのキャストは、型の安全性の警告が生成されます。 Javaのジェネリック型は変更されていないため、型チェックに必要な情報は実行時には使用できません。このようなキャストを実行すると、明示的なキャストがないコード内のポイントにClassCastExceptionがある可能性があります。例えば:

List<String> y = (List<String>) list4[1]; /* Ignore the warning... */ 
... 
... 
String s = y.get(0); /* Throws ClassCastException, even though there's 
         no (explicit) cast at this location! */ 

無制限タイプに割り当てるであろうそのようなアレイを使用するための正しい方法は:

List<?> y = list4[1]; 
Object z = y.get(0); 
+0

上記の例を参照してください。 – yapkm01

関連する問題