我正在尝试将字符串列表转换为 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));
}
当我删除<?>
时从列表描述来看,它有效。然而,当我添加它时它会中断。它给了我这个错误:
The method add(capture#6-of ?) in the type List is not applicable for the arguments (double)
这是为什么?
最佳答案
这背后的想法是 List<?>
代表通用 List
某种未知类型的。这个List<?>
可能是List<String>
, List<Double>
, List<File>
,或者任何真正的东西,所有这些都算作 List<?>
。这意味着如果您有一个 List<?>
类型的变量,你不能只添加 Double
到它,因为 myListOfWildcard.add(someDouble)
如果 myListOfWildcard
将会失败实际上是一个List<String>
,它可能是。
通配符(特别是 List<?>
)对于您希望能够包含任何内容的列表没有那么有用。对于那些您通常想要使用 List<Object>
的人。如果您想允许自己处理这些特殊情况,那么通配符会更有用。如果您有一个方法并且希望它能够接受任何类型的列表,无论是 List<String>
或List<Double>
,这就是List<?>
很有用,因为其中任何一个都是 List<?>
。但是,您无法假设有关列表的实际泛型类型参数的任何信息,这意味着您不能只添加 Double
.
List<?>
是 List<? extends Object>
的快捷方式。通配符列表最适合作为方法的参数;您通常不想自己创建它们。 Collection.containsAll是它们使用的一个很好的现实世界示例:特别是 Collection.containsAll
接受任何 Collection
作为其论点。它不一定是 Collection<Object>
,但如果 Collection<Object>
就会这样其中列为其类型而不是 Collection<?>
。
编辑:添加评论中的段落。
关于java - 为什么在列表声明中添加 <?> 在从字符串列表转换为 double 列表时会导致错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43493112/