为什么这个java 8流操作的计算结果为对象而不是List<Object>或只是List?
我正在使用3d派对库,他们返回缺少类型规范的Collections(例如),并且我正在尝试转换它们的返回类型并返回具有正确类型的列表。public List getFoo();
我创建了一个简单的示例来演示问题。例如:
编辑原来的问题宣布 l2 为 a 而不是 a,现在已得到纠正。ArrayList
List
import java.util.List;
import java.util.ArrayList;
import java.util.stream.Collectors;
public class Foo {
public static void main(String[] args) {
ArrayList l = new ArrayList();
l.add(1);
l.add(2);
List<String> l2 = l.stream().map(Object::toString).collect(Collectors.toList());
}
}
这无法编译。
$ javac Foo.java
Foo.java:10: error: incompatible types: Object cannot be converted to List<String>
List<String> l2 = l.stream().map(Object::toString).collect(Collectors.toList());
^
1 error
如果我稍微修改程序,以便它编译,我可以检查流/收集操作的返回类型。它“有效”,尽管我必须投射结果。
例如:
import java.util.ArrayList;
import java.util.stream.Collectors;
public class Foo {
public static void main(String[] args) {
ArrayList l = new ArrayList();
l.add(1);
l.add(2);
Object l2 = l.stream().map(Object::toString).collect(Collectors.toList());
System.out.println(l2.getClass());
}
}
运行此显示...
$ javac Foo.java
Note: Foo.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
$ java Foo
class java.util.ArrayList
不出所料。
因此,Collectors.listCollector() 在运行时执行正确的操作,但是这种编译时行为是预期的吗?如果是这样,是否有“适当”的方法来解决这个问题?