关于泛型奇怪的行为对我来说

时间:2015-05-10 22:56:54

标签: java generics

采取以下代码:

 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不允许在String&#34; three&#34;等对象上使用add()方法。但另一方面它引用了一个包含Objects的列表。

1 个答案:

答案 0 :(得分:3)

编译器并不关心列表 instance 接受的对象类型。在字节代码级别,由于类型擦除,任何引用都被接受。它只知道使用特定泛型类型参数化的List类型的两个变量。其中一个变量可以分配给另一个变量,这些变量被检查然后被遗忘。

因此,当您尝试添加"three"时,它会查看list2类型所接受的泛型类型,看它是否匹配,并抛出编译错误。

至于程序:没有任何问题。如果您想通过变量引用来限制要从列表中添加或删除的对象,那么由您决定。

请注意,如果没有强制转换,则无法从变量引用的列表中检索String