簡體   English   中英

泛型混淆中的類型擦除

[英]Type erasure in generics confusion

我正在閱讀泛型中類型擦除的概念。 在執行以下代碼時,我感到困惑。

public class CollectionsWild {
    void Test(Collection<?> t){
        System.out.println("Collection");
    }

    void Test(List<Integer> t){
        System.out.println("List");
    }


    public static void main(String[] args) {
        CollectionsWild o = new CollectionsWild();
        o.Test(new ArrayList<String>());
    }

}

根據類型擦除的概念,“ List<Integer> t t”以字節碼轉換為“ List t”。 那么為什么要調用我的方法測試呢?它以Collection為參數。 它應該已經使用List作為參數調用了方法

這與擦除無關。 重載解析在編譯時完成。 只有一個重載與ArrayList<String>匹配,這就是選擇的重載。 如果有多個比賽,則將選擇最具體的比賽。

在具有相同類型擦除的重載的情況下,甚至在考慮重載解析之前都不會編譯類型的定義。

方法的選擇是編譯時的事情。 類型擦除隨后發生。 正如您在JLS§15.12.2中看到的那樣考慮泛型類型參數:

在泛型方法(第8.4.4節)的情況下,確定方法是否適用將需要對類型參數進行分析。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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