簡體   English   中英

為什么編譯器會處理List <?> 和列表 <? extends Object> 不同?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM