List<String> srcList = new ArrayList<>();
srcList.add("a");
srcList.add("b");
srcList.add("c");
List<String> descList = new ArrayList<>(3);
descList.add("1");
descList.add("2");
descList.add("3");
// public static <T> void copy(List<? super T> dest, List<? extends T> src)
Collections.copy(descList, srcList);
for (String item: descList) {
System.out.println(item);
}
List<? super String> listC = new ArrayList<>();
listC.add("A");
listC.add("B");
listC.add("C");
Collections.copy(listC, srcList);
for (String item : listC) { System.out.println(item); }// complie error.
<? super T>
表示T或T的父类(super class)。
在方法Collections.copy()
中参数dest
可以纠正 foreach
上的工作。
为什么自定义列表对象 listC
无法获取此列表的项目。
最佳答案
通过声明List<? super String> listC
,你是说listC
可能是List<String>
,或 List<Object>
或List<CharSequence>
,或 List
String
的任何其他父类(super class)型.
现在,行for (String item: listC)
没有意义,因为如果 listC
是 List<Object>
,或 List<String>
以外的其他内容,那么它的内容不一定是String
s。这就是编译器告诉您的内容。
关于 java ? Collection 中的 super T 复制为什么正确工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47707599/