【问题标题】:How convert a non-generic List to a List<String>?如何将非泛型 List 转换为 List<String>?
【发布时间】:2018-10-06 04:13:51
【问题描述】:

当我尝试使用 Java 8 流进行转换时,出现编译错误:

不兼容的类型
必需:列表
找到:java.lang.Object

    ArrayList list = new ArrayList();
    list.add("Test");
    list.add("Java");
    list.add("Other");

    //This won't compile
    List<String> strings = list.stream()
        .map(object -> Objects.toString(object, null))
        .collect(Collectors.toList());

【问题讨论】:

  • 不要使用 raw 泛型类型,也就是非泛型列表。只需将代码更改为ArrayList&lt;String&gt; list = new ArrayList&lt;&gt;();
  • @Andreas 从标题中我猜他由于某种原因无法更改
  • 如果你知道这是List&lt;String&gt;,你就不能直接投吗? ((List&lt;String&gt;)list).stream()
  • @eis 正确。我实际上正在调用返回 List 的第 3 方方法
  • 您可以毫无问题地将其转换为List&lt;String&gt;

标签: java java-stream


【解决方案1】:

来自comment

我实际上是在调用一个返回 List 的第 3 方方法

然后将值转换为 List&lt;Object&gt;List&lt;?&gt; (thanks, Sean Van Gorder) 所以它不再是 raw 泛型,流代码将起作用:

List<?> list = thirdPartyMethod();

List<String> strings = list.stream()
        .map(object -> Objects.toString(object, null))
        .collect(Collectors.toList());

从逻辑上讲,ListList&lt;Object&gt; 之间没有区别,但是编译器有很大的不同,因为 raw 泛型在编译器中强制向后兼容模式,其中 all 泛型被忽略,导致整个流链表现不佳。

【讨论】:

  • 或者直接投:(List&lt;String&gt;) thirdPartyMethod().
  • @JohnKugelman 返回的列表可能不是字符串列表,否则将不需要 Objects.toString。对于该流链,起点将是某种对象的列表,但可能不是字符串列表。
  • List&lt;?&gt; list 应该修复未检查的警告。
【解决方案2】:

使用此代码

编辑的完整代码

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

    public class MyFunction {

        public static void main(String args[]) {
            ArrayList list = new ArrayList();
            list.add("Test");
            list.add("Java");
            list.add("Other");
            @SuppressWarnings("unchecked")
            List<String> strings = (List<String>) list.stream().map(object -> Objects.toString(object, null))
                    .collect(Collectors.toList());

            System.out.println(strings.get(0));
        }
    }

此代码将成功编译并运行。

【讨论】:

  • 由于 OP 使用Objects.toStringObject 转换为String,您应该转换为List&lt;Object&gt;
  • 最好在调用 stream() 之前立即转换为 List&lt;Object&gt;,这样所有流操作都可以使用检查的泛型完成。
猜你喜欢
  • 2020-01-11
  • 2013-08-26
  • 2020-11-27
  • 2021-09-17
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多