为什么在从String列表转换为Double列表时将<! - ? - >添加到List声明会导致错误?

时间:2017-04-19 10:29:54

标签: java arraylist casting

我正在尝试将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?)不是   适用于参数(双)

为什么?

1 个答案:

答案 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}}。

编辑:添加评论中的段落。