2017-08-13 12 views
0

私はPECSの概念とその理由add()以下のコンパイルを理解してコンパイルしない追加することはできませんするジェネリックコレクションの作成:どちらが指定されたタイプ

List<? super ClassCastException> list = new ArrayList<>(); 
list.add(new ClassCastException()); // OK 
list.add(new Exception()); // Does not compile 

をしかし、その後、違法以下にすべきではありませんの?何故なの? (インスタンス化するとき、我々は追加することはできませんスーパータイプを指定する)

List<? super ClassCastException> list2 = new ArrayList<Exception>(); // Compiles 
                 ^
+2

リストはList <? super ClassCastException> –

答えて

1

のは、コードの最初の部分が違法である理由を調べてみましょう:

List<? super ClassCastException> list = new ArrayList<>(); 
list.add(new Exception()); // Does not compile 

listはリスト、つまりタイプList<? super ClassCastException>でありますClassCastExceptionの親である未知の型。 Exceptionを置くことはできません。なぜなら、リストが実際にRuntimeExceptのリストの場合はどうでしょうか? RuntimeExceptionも親クラスのClassCastExceptionですね。 ExceptionRuntimeExceptionのリストに入れることはできません。

はしかし、これは異なっている:

List<? super ClassCastException> list2 = new ArrayList<Exception>(); 

あなたはlist2に何を割り当てることができますか? list2は、ClassCastExceptionの親である未知の型のリストとして宣言されています。基準に適合する任意の種類のリストを割り当てることができる。

"しかし、他の親クラスはClassCastExceptionですが!"あなたは言う。さて、そこにはありますが、代入文では、実際にはlist2の元の値が何であるか気にしますか?いいえ。list2が元々ArrayList<RuntimeException>だった場合は、引き続きArrayList<Exception>を割り当てることができます。ここに矛盾はありません。最初の段落のイタリック体を参照してください。これはException? super ClassCastExceptionのリストに入れると起こる矛盾です。あなたはこの割り当てステートメントについて間違って何かを指摘することはできません。

+0

バインドされたリストへの追加と、バインドされた参照への割り当ての比較。 – Andrejs

関連する問題