请帮我理解代码

时间:2013-06-05 04:09:23

标签: java

我无法理解以下代码段:

List<? extends Number> intList = Collections.nCopies(5, new Integer(10));
List<Object> objList = new ArrayList<Object>();

for(int i = 0; i < 5; i++) {

objList.add(new Object());

}

Collections.copy(objList, intList);

System.out.println("The objList is: " + objList);

复制方法的声明:

static <T> void copy(List<? super T> dest, List<? extends T> src);

我理解,通过List<Object> objList = new ArrayList<Object>();objList.add(new Object());行,对象正在替换T和?并且由于复制方法的声明规定其第一个参数应该是T的超类,并且与extends不同,super是独占条款吗?和T必须不一样,我不认为它是有效的代码。 它可能更像是这样:

List<Integer> objList = new ArrayList<Integer>(); (but it gives compilation error.

那么这段代码是如何工作的?你能解释一下吗?

1 个答案:

答案 0 :(得分:0)

与你的理解相反,超级关系是反身的(因此,对于所有T,T是超类型的T)。

因此,令人满意的复制类型是:

void copy(List<Object>, List<Number>)

因为Number扩展了Object,而Object是超类型的Object。

本教程中对此进行了解释:http://docs.oracle.com/javase/tutorial/extra/generics/morefun.html