簡體   English   中英

關於我的仿制葯怪異行為

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

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