2017-10-11 35 views
0

首先,为什么第一行编译,而第二行没有?其次,在第二行的情况下,两种类型总是需要相同,即左侧是整数,右侧是整数。或者是否有可能在左侧和右侧有不同的类型?用不同的数据类型初始化ArrayList

List<? super Integer> nums1 = new ArrayList<Number>(); //COMPILES 
    List<Integer> nums2 = new ArrayList<Number>();   //DOES NOT COMPILE 
+0

你需要什么? –

+0

只是我的理解。代码可能不会看到白天的光芒。 – JonJavaK

+1

我猜是因为'Number'是'Integer'的超类,但不是'Integer'。 – Blorgbeard

回答

2

你的问题是esentially的this SO-article重复,但在短:

? super T的意思是 “什么是T的父”。 NumberInteger的超类,所以这被接受。第二行不起作用,因为Number不是Integer。否则反之亦然,

ArrayList<Number> nums2 = new ArrayList<Integer>(); 

也会导致编译错误。为此,您可以使用

ArrayList<? extends Number> nums2 = new ArrayList<Integer>(); 
+0

然后关闭重复。 –

+0

@ThorbjørnRavnAndersen原因有二:1.我不认为我可以单独回答一个问题,我发现这样做有点粗鲁。 2.即使链接的SO文章在这里涵盖了这个问题,我认为它更有助于回答这个问题,因为它更容易理解您的代码是否用于答案,而不是指向一般答案(这仍然值得阅读以获得全部细节) – Lothar