Java 8 在Java8中,如何在具有流的列表实例中强制转换元素?

Java 8 在Java8中,如何在具有流的列表实例中强制转换元素?,java-8,java-stream,Java 8,Java Stream,鉴于代码: public Statement methodCallByName(MethodDeclaration method, String string) { List<ExpressionStatement> expressions = method.getBody().statements().stream() .filter(s -> s instanceof E

鉴于代码:

public Statement methodCallByName(MethodDeclaration method, String string) {
    List<ExpressionStatement> expressions = method.getBody().statements().stream()
                                                .filter(s -> s instanceof ExpressionStatement)
                                                .map(ExpressionStatement.class::cast)
                                                .collect(Collectors.toList());
    return null;
}
公共语句methodCallByName(MethodDeclaration方法,String){
列表表达式=方法.getBody().statements().stream()
.filter(s->s ExpressionStatement实例)
.map(ExpressionStatement.class::cast)
.collect(Collectors.toList());
返回null;
}
Eclipse Oxygen中有以下错误:

请注意,
statements()
根据返回一个
列表


有什么问题吗?

问题是由
语句()
返回原始类型
列表引起的(另请参见)

原始类型不仅可能引发未检查的操作,而且还限制了类型推断的适用性

你可以用它来修理

public Statement methodCallByName(MethodDeclaration method, String string) {
    List<?> statements = method.getBody().statements();
    List<ExpressionStatement> expressions = statements.stream()
        .filter(s -> s instanceof ExpressionStatement)
        .map(ExpressionStatement.class::cast)
        .collect(Collectors.toList());
    // ...
    return null;
}


您是否尝试过
javac
?这是标准问题
statements()
返回原始类型
列表
,因此,泛型的所有优点在该点之后都被禁用。
.filter(s -> s instanceof ExpressionStatement)
.map(s -> (ExpressionStatement)s)
.filter(ExpressionStatement.class::isInstance)
.map(ExpressionStatement.class::cast)