如何将非泛型List转换为List <String>?

Don*_*mmy 8 java java-stream

当我尝试使用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());
Run Code Online (Sandbox Code Playgroud)

And*_*eas 10

来自评论:

我实际上是在调用返回的第三方方法 List

然后将值转换为a List<Object>List<?> (感谢Sean Van Gorder),因此它不再是原始通用,并且流代码将起作用:

List<?> list = thirdPartyMethod();

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

从逻辑上讲,a List和a 之间没有区别List<Object>,但编译器之间存在很大差异,因为原始泛型强制编译器中的向后兼容模式,其中所有泛型都被忽略,导致整个流链表现不佳.

  • `List <?> list`应该修复未经检查的警告. (4认同)
  • @JohnKugelman返回的列表可能不是字符串列表,否则不需要`Objects.toString`.对于该流链,起点将是某种对象的列表,但可能不是字符串列表. (2认同)