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