给出代码:
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;
}
我在Eclipse Oxygen中遇到以下错误:
请注意,statements()
根据JDT docs返回了List
。
怎么了?
答案 0 :(得分:6)
此问题是由于statements()
返回原始类型 List
(另请参见What is a raw type and why shouldn't we use it?)引起的。
原始类型不仅会引发未经检查的操作,还会限制类型推断的适用性。
您可以使用
对其进行修复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;
}
从原始类型List
到未知元素类型List<?>
的列表的转换是我们在此可以进行的唯一类型安全转换。由于您仍然要检查和投射元素,因此没有限制。
但是请注意,您应该保持一致。要么使用
.filter(s -> s instanceof ExpressionStatement)
.map(s -> (ExpressionStatement)s)
或
.filter(ExpressionStatement.class::isInstance)
.map(ExpressionStatement.class::cast)