首先,为什么第一行编译而第二行不编译? 其次,在第二行的情况下,两种类型总是需要相同,即左边的整数和右边的整数。或者是否可以在左侧和右侧使用不同的类型?
List<? super Integer> nums1 = new ArrayList<Number>(); //COMPILES
List<Integer> nums2 = new ArrayList<Number>(); //DOES NOT COMPILE
答案 0 :(得分:2)
您的问题实际上是this SO-article的副本,但简而言之:
? super T
表示“任何超级T的东西”。 Number
是Integer
的超类,因此可以接受。第二行不起作用,因为Number
不是Integer
。反之亦然,无论如此
ArrayList<Number> nums2 = new ArrayList<Integer>();
也会导致编译错误。为此你可以使用
ArrayList<? extends Number> nums2 = new ArrayList<Integer>();