我无法理解以下代码段:
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.
那么这段代码是如何工作的?你能解释一下吗?
答案 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