2017-04-19 62 views
1

我想一个字符串列表转换为双榜如下:为什么将<?>添加到List声明会导致从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)); 
} 

当我从列表中移除说明中的<?>,它的工作原理。但是,当我添加它时会中断。它给了我这个错误:

The method add(capture#6-of ?) in the type List is not applicable for the arguments (double)

这是为什么?

+2

请参阅:http://stackoverflow.com/questions/2745265/is-listdog-a-subclass-of-listanimal-why-arent-javas-generics-implicitly-p它不是一个笨蛋,但最重要的答案解释问题。 –

+0

顺便说一句,声明这样的列表:列表似乎工作。 – SpiderRico

+0

为什么不是'列表'? –

回答

0

这背后的想法是,List<?>表示一些未知类型的通用List。这List<?>可能是List<String>List<Double>List<File>,或任何真的,所有这些都算作List<?>。这意味着如果你有List<?>类型的变量,你不能只是增加一个Double它,因为如果myListOfWildcard实际上是一个List<String>,这也可能是myListOfWildcard.add(someDouble)会失败。

通配符(尤其是List<?>)是不是要能够遏制任何名单一样有用。对于那些你一般想用List<Object>。如果你想让自己处理这些特殊情况,通配符会更有用。如果你有一个方法,你希望它能够接受任何类型的列表,无论是List<String>List<Double>,这是List<?>是有用的,因为任何这些是List<?>。但是,您无法承担关于列表的实际泛型类型参数的任何事情,这意味着您不能仅添加Double

List<?>List<? extends Object>一个快捷方式。通配符列表主要用作方法的参数;你通常不想自己创造它们。 Collection.containsAll是一个很好的现实世界的例子:特别是,Collection.containsAll接受任何Collection作为其论点。它不一定是Collection<Object>,但它会如果Collection<Object>列为其类型而不是Collection<?>

编辑:从评论添加段落。

+0

*如果你有一个方法,你希望它是能够接受的,无论是列表或列表任何类型的列表,这是列表是有用的,*为什么你会不使用'名单'如好吧? –

+0

列表是List <?的快捷方式。扩展Object>。通配符通常用作方法的参数。你通常不想自己构造它们。作为一个真实的例子,请参阅[Collection.containsAll](https://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#containsAll(java.util.Collection))。 –

+0

特别是,'Collection.containsAll'接受任何'Collection'作为参数。它不*具有*作为'Collection ',如果你使用它,那将是。 –

相关问题