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 <: S
和S
沒有T
其中X
的類型參數未包含在T
的類型參數中。