0
Javaチュートリアルのジェネリックスの制限については、特にcasting with parameterized typesを読んでいます。私は提示されている例を理解しています。ただし、次の例についてはわかりません。パラメータ化された型のチェックされていないキャスト警告
List<? extends Number> l1 = new ArrayList<Integer>();
// unchecked cast warning
ArrayList<Number> l2 = (ArrayList<Number>) l1;
// no unchecked cast warning
ArrayList<? extends Number> l3 = (ArrayList<? extends Number>) l1;
最初のケースで警告が表示される理由を理解しています。なぜ2番目のケースで警告が表示されないのですか? l3
で実行できる操作は安全です(例:Float
をリストに追加することはできません)。
UPDATE:以下は同様の質問に対処しsection 5.5.2 of the JLSからの抜粋です。
S <: T
- 型引数のすべて(以下の少なくともいずれかに該当する場合を除き
パラメータ化された型のタイプ
S
からのキャストは(§4.5)T
はオフ です§4.5.1)はT
であり、無制限のワイルドカードである T <: S
およびS
には、X
以外にT
タイプ引数がX
で、タイプ引数がT
ではありません。