首先,为什么第一行编译,而第二行没有?其次,在第二行的情况下,两种类型总是需要相同,即左侧是整数,右侧是整数。或者是否有可能在左侧和右侧有不同的类型?用不同的数据类型初始化ArrayList
List<? super Integer> nums1 = new ArrayList<Number>(); //COMPILES
List<Integer> nums2 = new ArrayList<Number>(); //DOES NOT COMPILE
首先,为什么第一行编译,而第二行没有?其次,在第二行的情况下,两种类型总是需要相同,即左侧是整数,右侧是整数。或者是否有可能在左侧和右侧有不同的类型?用不同的数据类型初始化ArrayList
List<? super Integer> nums1 = new ArrayList<Number>(); //COMPILES
List<Integer> nums2 = new ArrayList<Number>(); //DOES NOT COMPILE
你的问题是esentially的this SO-article重复,但在短:
? super T
的意思是 “什么是T的父”。 Number
是Integer
的超类,所以这被接受。第二行不起作用,因为Number
不是Integer
。否则反之亦然,
ArrayList<Number> nums2 = new ArrayList<Integer>();
也会导致编译错误。为此,您可以使用
ArrayList<? extends Number> nums2 = new ArrayList<Integer>();
然后关闭重复。 –
@ThorbjørnRavnAndersen原因有二:1.我不认为我可以单独回答一个问题,我发现这样做有点粗鲁。 2.即使链接的SO文章在这里涵盖了这个问题,我认为它更有助于回答这个问题,因为它更容易理解您的代码是否用于答案,而不是指向一般答案(这仍然值得阅读以获得全部细节) – Lothar
你需要什么? –
只是我的理解。代码可能不会看到白天的光芒。 – JonJavaK
我猜是因为'Number'是'Integer'的超类,但不是'Integer'。 – Blorgbeard