![](/img/trans.png)
[英]Why can't we pass ArrayList<Integer> to a method with (Integer…) parameter?
[英]Why ArrayList<T> can assign to ArrayList<Integer>
public class Demo {
public static void main(String[] args) {
ArrayList<Integer> list = getList();
System.out.println(list.toString());
list.add(1);
System.out.println(list.toString());
}
public static <T> ArrayList<T> getList(){
ArrayList<String> strings = new ArrayList<>();
strings.add("qwert");
return (ArrayList<T>) strings;
}
}
如上所示的代碼為什么允許分配給 ArrayList JDK11 輸出
[qwert]
1
為什么
ArrayList<T>
可以賦值給ArrayList<Integer>
這是因為您提供了顯式類型轉換。
可能您無法理解的是ArrayList<Integer> list
如何容納qwert
。 同樣,這是因為您已要求編譯器信任您,因此您將Integer
放入其中。
最終,當涉及到運行時,所有類型信息都會被刪除。 您需要了解類型擦除的概念。
return (ArrayList<T>) strings;
這里,String ArrayList 沒有直接轉換為Integer ArrayList,而是轉換為T ArrayList。 根據文檔中的“目標類型推斷”:
static <T> List<T> emptyList();
List<String> listOne = Collections.emptyList();
該語句需要一個 List 實例; 此數據類型是目標類型。 因為方法 emptyList 返回一個 List 類型的值,編譯器推斷類型參數 T 必須是值 String。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.