のは、コードの最初の部分が違法である理由を調べてみましょう:
List<? super ClassCastException> list = new ArrayList<>();
list.add(new Exception()); // Does not compile
list
はリスト、つまりタイプList<? super ClassCastException>
でありますClassCastException
の親である未知の型。 Exception
を置くことはできません。なぜなら、リストが実際にRuntimeExcept
のリストの場合はどうでしょうか? RuntimeException
も親クラスのClassCastException
ですね。 Exception
をRuntimeException
のリストに入れることはできません。
はしかし、これは異なっている:
List<? super ClassCastException> list2 = new ArrayList<Exception>();
あなたはlist2
に何を割り当てることができますか? list2
は、ClassCastException
の親である未知の型のリストとして宣言されています。基準に適合する任意の種類のリストを割り当てることができる。
"しかし、他の親クラスはClassCastException
ですが!"あなたは言う。さて、そこにはありますが、代入文では、実際にはlist2
の元の値が何であるか気にしますか?いいえ。list2
が元々ArrayList<RuntimeException>
だった場合は、引き続きArrayList<Exception>
を割り当てることができます。ここに矛盾はありません。最初の段落のイタリック体を参照してください。これはException
を? super ClassCastException
のリストに入れると起こる矛盾です。あなたはこの割り当てステートメントについて間違って何かを指摘することはできません。
リストはList <? super ClassCastException> –