2017-06-04 13 views
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ではありません。

答えて

2

キャストは型のジェネリック部分を変更しないため警告はありません。 List<? extends Number>ArrayList<? extends Number>は同じ型引数を持ちます。代わりに、キャストはListからArrayListまでのチェックキャストです。

関連する問題