我正在尝试将String列表转换为Double列表,如下所示:
List<String> myStringList = Arrays.asList("10.0", "10.5", "5.0");
List<?> myDoubleList = new ArrayList();
for(String s : myStringList){
myDoubleList.add(Double.parseDouble(s));
}
当我从列表说明中删除<?>
时,它可以正常工作。但是当我添加它时会中断。它给了我这个错误:
类型List中的方法add(capture#6-of?)不是 适用于参数(双)
为什么?
答案 0 :(得分:0)
这背后的想法是List<?>
代表某种未知类型的通用List
。此List<?>
可以是List<String>
,List<Double>
,List<File>
或其他任何内容,所有这些都计为List<?>
。这意味着如果您有List<?>
类型的变量,则无法向其添加Double
,因为如果myListOfWildcard.add(someDouble)
实际为{myListOfWildcard
,则List<String>
会失败{1}},它可能是。
通配符(特别是List<?>
)对于您希望能够包含任何内容的列表并不有用。对于那些您通常想要使用List<Object>
的人。如果您想让自己处于这些特殊情况,那么通配符会更有用。如果你有一个方法,并且你希望它能够接受任何类型的列表,无论是List<String>
还是List<Double>
,这都是List<?>
有用的,因为其中任何一个都是一个List<?>
。但是,您无法假设列表的实际泛型类型参数,这意味着您无法添加Double
。
List<?>
是List<? extends Object>
的快捷方式。通配符列表最常用作方法的参数;你通常不想自己创造它们。 Collection.containsAll是一个很好的现实世界范例:特别是Collection.containsAll
接受任何Collection
作为其参数。它不必是Collection<Object>
,但如果将Collection<Object>
列为其类型而不是Collection<?>
,则会{{1}}。
编辑:添加评论中的段落。