我在类中有一个方法,它采用“List”类型参数。当我运行 Spotbugs 检查时,它返回以下错误(过于具体的参数)。尽管给定的方法使用列表,但它抱怨具体参数。有人可以告诉我我在这里缺少什么吗?
.TestClass.transform(List): 1st parameter 'dtos' could be declared as java.lang.Iterable instead
[com.TestClass] At TestClass.java:[line 146] OCP_OVERLY_CONCRETE_PARAMETER
public void transform(final List<Dto1> dtos) { //line 145
for (final Dto1 dto : dtos) { //line 146
Dto2 dto2 = convert(dto);
..
}
}
虽然给定的方法使用列表,但它抱怨具体参数。
它抱怨一个“过于”的具体参数。 List
是一个接口,但方法使用它的方式并不具体取决于它。
诊断消息已经告诉您:
.TestClass.transform(List): 1st parameter 'dtos' could be declared as java.lang.Iterable instead
也就是说,将参数声明为
Iterable<Dto1>
而不是
List<Dto1>
将接受更广泛的参数,而不会更改任何与较窄类型匹配的参数的行为。在这种情况下,另一种概括也应该是可能的:您可以使用有界通配符:Iterable
,而不是该
Iterable<? extends Dto1>
的确切类型参数。这是您可以创建的最广泛的参数类型,支持该方法的所有当前行为。换句话说:public void transform(final Iterator<? extends Dto1> dtos) {
for (final Dto1 dto : dtos) {
Dto2 dto2 = convert(dto);
// ...
}
}