采取以下代码:
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的列表。
答案 0 :(得分:3)
编译器并不关心列表 instance 接受的对象类型。在字节代码级别,由于类型擦除,任何引用都被接受。它只知道使用特定泛型类型参数化的List
类型的两个变量。其中一个变量可以分配给另一个变量,这些变量被检查然后被遗忘。
因此,当您尝试添加"three"
时,它会查看list2
类型所接受的泛型类型,看它是否匹配,并抛出编译错误。
至于程序:没有任何问题。如果您想通过变量引用来限制要从列表中添加或删除的对象,那么由您决定。
请注意,如果没有强制转换,则无法从变量引用的列表中检索String
。