【问题标题】:Why adding <?> to List declaration causes error when converting from String list to Double list?为什么在从 String 列表转换为 Double 列表时将 <?> 添加到 List 声明会导致错误?
【发布时间】:2017-04-19 10:29:54
【问题描述】:

我正在尝试将 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));
}

当我从列表描述中删除 &lt;?&gt; 时,它可以工作。但是,当我添加它时它会中断。它给了我这个错误:

List 类型中的方法 add(capture#6-of ?) 不是 适用于参数(双)

为什么会这样?

【问题讨论】:

  • 见:stackoverflow.com/questions/2745265/… 这不是骗人的,但上面的答案说明了问题。
  • 顺便说一句,像这样声明列表: List 似乎正在工作。
  • 为什么不是List&lt;Double&gt;
  • @AlexeyRomanov 因为我需要一个泛型类型来避免以后的代码重复。
  • @SpiderRico 从您的问题中不清楚List&lt;?&gt; 将如何“避免以后重复代码”,但myDoubleList 的类型不能完全通用,因为它需要支持向其添加双打.除了List&lt;Double&gt;,您还希望使用什么类型的列表?

标签: java arraylist casting


【解决方案1】:

这背后的想法是List&lt;?&gt; 代表某种未知类型的通用List。这个List&lt;?&gt; 可以是List&lt;String&gt;List&lt;Double&gt;List&lt;File&gt;,或者任何真正的东西,所有这些都算作List&lt;?&gt;。这意味着如果你有一个List&lt;?&gt; 类型的变量,你不能只添加一个Double 到它,因为如果myListOfWildcard 实际上是一个List&lt;String&gt;myListOfWildcard.add(someDouble) 会失败,它可能是。

通配符(尤其是List&lt;?&gt;)对于您希望能够包含任何内容的列表没有那么有用。对于那些你通常想使用List&lt;Object&gt; 的人。如果您想允许自己处理这些特殊情况,通配符会更有用。如果您有一个方法并且希望它能够接受任何类型的列表,无论是List&lt;String&gt; 还是List&lt;Double&gt;,这就是List&lt;?&gt; 的用处,因为其中任何一个都是List&lt;?&gt;。但是,您无法对列表的实际泛型类型参数进行任何假设,这意味着您不能只添加Double

List&lt;?&gt;List&lt;? extends Object&gt; 的快捷方式。通配符列表最常用作方法的参数;您通常不想自己创建它们。 Collection.containsAll 是一个很好的真实世界使用示例:特别是,Collection.containsAll 接受任何 Collection 作为其参数。它不一定是Collection&lt;Object&gt;,但如果Collection&lt;Object&gt; 列为其类型而不是Collection&lt;?&gt;,则它会。

编辑:添加来自 cmets 的段落。

【讨论】:

  • 如果你有一个方法并且你希望它能够接受任何类型的列表,无论是 List 还是 List,这就是 List>有用,那你为什么不使用List&lt;Object&gt;呢?
  • List> 是 List。通配符主要用作方法的参数。您通常不想自己构建它们。请参阅 Collection.containsAll 作为真实示例。
  • 特别是,Collection.containsAll 接受任何 Collection 作为参数。它必须Collection&lt;Object&gt;,如果你使用它就会是这样。
猜你喜欢
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 2015-06-10
  • 1970-01-01
相关资源
最近更新 更多