[英]about generics strange behavior for me
采取以下代碼:
public class Main {
public static void main(String[] args) {
List<Object> list1 = new ArrayList<Object>();
List<? super Integer> list2 = list1;
list2.add(1);
list1.add("two");
//list2.add("three"); // will never compile!!.
System.out.println("list1: " + list1.toString());
System.out.println("list2: " + list2.toString());
}
}
這是輸出:
list1: [1, two]
list2: [1, two]
一方面,list2不允許對字符串“三”之類的對象使用add()方法; 但另一方面,它引用包含對象的列表。
編譯器不在乎列表實例接受哪種對象。 在字節碼級別,由於類型擦除,任何引用都可以接受。 它只知道兩個變量,這些變量具有用特定泛型類型參數化的List
類型。 這些變量之一可分配給另一個變量是被檢查然后遺忘的東西。
因此,當您嘗試添加"three"
它將查看list2
類型所接受的泛型類型,發現其不匹配,並引發編譯錯誤。
至於程序:沒有任何問題。 如果要通過變量引用限制要在列表中添加或刪除的對象,則取決於您。
請注意,如果不進行強制轉換,則不可能從變量引用的列表中檢索String
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.