2017-06-04 77 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; 

我明白爲什麼在第一種情況下會出現警告。爲什麼在第二種情況下沒有警告?是否因爲我可以在l3上執行的唯一操作是安全的(例如,我不能在列表中添加(說)Float)?


UPDATE:下面是從section 5.5.2 of the JLS,解決類似的問題的摘錄。

從類型S的流延到一個參數化的類型(§4.5)T未選中 除非以下中的至少一項爲真:

  • S <: T
  • 所有的類型參數( §4.5.1)T是無界通配符
  • T <: SS沒有T其中X的類型參數未包含在T的類型參數中。

回答

2

沒有警告,因爲轉換不會改變類型的泛型部分。 List<? extends Number>ArrayList<? extends Number>具有相同的類型參數。相反,演員陣容是從ListArrayList

相關問題