即使使用List类型对象也会出现过于具体的参数错误(OCP_OVERLY_CONCRETE_PARAMETER)

问题描述 投票:0回答:1

我在类中有一个方法,它采用“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);
      ..
    }
  }
java static-analysis spotbugs
1个回答
0
投票

虽然给定的方法使用列表,但它抱怨具体参数。

它抱怨一个“过于”的具体参数。 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);
        // ...
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.