![](/img/trans.png)
[英]Why does the List<? extends Foo> not accept an object of the Foo class?
[英]Why does the compiler treat List<?> and List<? extends Object> differently?
請考慮以下代碼:
import java.util.ArrayList;
import java.util.List;
public class UnboundedWildcardProblem {
public static void main(String[] args) {
List<?> a = new ArrayList();
List<? extends Object> b = new ArrayList();
}
}
List<?>
的創建不會產生任何警告,但創建List<? extends Object>
List<? extends Object>
產生一個未經檢查的警告:
Warning: java: unchecked conversion
required: java.util.List<? extends java.lang.Object>
found: java.util.ArrayList
我搜索了可能的原因並找到了一些討論:
列表<?> vs List <? extends Object>
<?>和<?之間有什么區別? 在Java Generics中擴展Object>?
但在閱讀這些討論后,在我看來List<?>
和List<? extends Object>
List<? extends Object>
是一回事。
那么,這種編譯器行為的原因是什么?
編輯:
用於編譯的單個標志是Xlint:unchecked標志。
List<?>
的創建不會產生任何警告,但創建List<? extends Object>
List<? extends Object>
生成未經檢查的警告
實際上,如果使用-Xlint:all
或只是Xlint
選項編譯代碼,則會收到List<?> a = new ArrayList();
聲明,如:
warning: [rawtypes] found raw type: ArrayList
List<?> a = new ArrayList();
^
missing type arguments for generic class ArrayList<E>
where E is a type-variable:
E extends Object declared in class ArrayList
但是,您沒有獲得未經檢查的警告本身的原因是因為類型List<?>
僅包含本節中從Java語言規范中提到的無界通配符:
從原始類或接口類型(§4.8)G到
G<T1,...,Tn>
形式的任何參數化類型都有未經檢查的轉換。...
使用未經檢查的轉換會導致編譯時未經檢查的警告,除非所有類型參數Ti(1≤i≤n)都是無界通配符(第4.5.1節) ,或者未經檢查的警告被
SuppressWarnings
注釋(第9.6.4.5節)SuppressWarnings
。
但是在本節中 ,提到:
通配符
? extends Object
? extends Object
相當於無界通配符?
。
這表明編譯器中存在細微的不一致。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.