我们的代码有点类似于下面,其中我们有枚举,我们检查该枚举类型的给定变量是否存在于该枚举类型的列表中。
import java.util.ArrayList;
import java.util.List;
public class Test {
public static enum Color {RED, BLUE, GREEN};
public static void main(String[] args) {
Enum<Color> red = Color.RED;
List<Color> colorList = new ArrayList<>();
colorList.add(Color.GREEN);
// ** Find bugs reports warning - GC_UNRELATED_TYPES
System.out.println(colorList.contains(red));
}
}
我们的QA团队针对此代码运行了FindBugs,并且他们已经标记了一个警告 - GC_UNRELATED_TYPES,其中声明了
GC:泛型参数和方法参数之间没有关系 (GC_UNRELATED_TYPES)
这种对泛型集合方法的调用包含一个带参数的参数 与集合参数不相容的类(即 参数的类型既不是超类型也不是子类型 对应的泛型类型参数)。因此,它不太可能 该集合包含与该方法相同的任何对象 这里使用的论点。最有可能的是,传递错误的价值 方法。
我的问题是什么是类型为Enum<EnumClass>
的变量的使用,并且应该修复FindBug警告。我们目前正计划通过使用类型转换来解决它。
colorList.contains((Color) red)
如果我们假设我们无权将Enum<Color>
更改为Color
变量red
,那么这是否是修正此警告的正确方法。
更新
我们不能随意更改变量的原因是 - 在实际代码中,我们有一个GUI可重用控件 - EnumListBox
- 它似乎被设计为可以与任何枚举一起使用 - 因此,当我们继承{{1}时1}}创建特定用途 - 我们必须覆盖一个接受类型参数的方法,让我们说EnumListBox
。
答案 0 :(得分:5)
Enum
与Class
类似,它不是enum Color
的实体,而是它的类型,因此Enum<Color>
是Class<Color>
的类似构造} ...
您的Enum<Color> red = Color.RED;
行没有多大意义
它应该是Color red = Color.RED;
...
另见 Joop Eggen ...
以下评论答案 1 :(得分:1)
正如您可以从here读到的那样,Enum<?>
是每个枚举的父亲。
这里的问题是FindBugs现在只有:
Color
Enum
这绝对是一个案例,其中FindBugs对你知道并不真正危险的事情发出警告,可能是因为它无法推断Color
和Enum<Color>
之间的关系(警告说明)明确指出。)
最干净的方法是改变red
的类型,但如果你不能,那么施法应该足够好。另一方面,使用Enum<Color>
更加冗长,并且不会增加代码的清晰度,所以我会调查是否需要以这种方式声明它。