2017-04-19 66 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 ',如果你使用它,那將是。 –

相關問題