采取以下代码:约泛型奇怪的行为,我
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]
,一方面,列表2不允许在对象的add()方法像弦“三”;但另一方面,它引用一个包含对象的列表。
你能澄清一下实际问题是什么吗?我假设它是这样的:“当list2的类型是'?super Integer'时,list2似乎包含一个字符串(在print语句中),特别是给它添加一个字符串为list2.add(”three“) '不会编译?“但你真正给出的只是一个观察。 – alexroussos
你拥有的是一个有效的赋值列表,如果你不考虑它被处理的序列,那么这个赋值可能看起来很奇怪。在你指定'list2 = list1'时,它是完全有效的,即使在稍后的点你可以通过'list1.add(“three”)添加新条目(因为它们实际上是一个单独的列表);'没有什么奇怪和不寻常的关于它 –