java - 为什么在列表声明中添加 <?> 在从字符串列表转换为 double 列表时会导致错误?

标签 java arraylist casting

我正在尝试将字符串列表转换为 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/

相关文章:

java - 通过Socket连续发送数据

java - 在 Java 中,如何用一个对象填充 arrayList 的一半,用另一个对象填充一半?

java - 在 ArrayList<Object[]> 中设置值

c++ - 指针寻址如何在 C++ 中工作

C++ 如何防止编译器在调用函数时进行隐式转换?

java - 为什么我在 Netbeans 中收到错误 : java. lang.IllegalArgumentException 和 java.lang.reflect.InitationTargetException?

java - 来自 Java 的 Ruby 中的 HMAC

iphone - 在方法之间传递时 float 被破坏(类型转换问题?)

java - Spring Batch 挂起,没有输出

Java:为什么同步列表会出现 ConcurrentModificationException?