我们的代码有点类似于下面,其中我们有枚举,我们检查该枚举类型的给定变量是否存在于该枚举类型的列表中。
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>
更改为可变red
的Color
,那是否是解决此警告的正确方法。
更新:我们不能自由更改变量的原因是 - 在实际代码中,我们有一个 GUI 可重用控件 -EnumListBox
- 它似乎被设计为与任何枚举一起使用 - 因此,当我们从EnumListBox
继承以创建特定用途时 - 我们必须覆盖一个接受类型参数的方法, 让我们说,Enum<Color>
.
Enum
就像Class
,它不是enum Color
的实体,而是它的类型,因此Enum<Color>
与Class<Color>
结构相似...
你的Enum<Color> red = Color.RED;
线没有多大意义。
应该是Color red = Color.RED;
...
另请参阅下面的评论 乔普·埃根...
正如你从这里读到的,Enum<?>
是每个枚举的父亲。
这里的问题是FindBugs现在只有:
- 该列表包含类型为
Color
的元素 - 您正在尝试的类型是
Enum
这绝对是 FindBugs 对你知道并不真正危险的东西发出警告的情况,可能是因为它无法推断Color
和Enum<Color>
之间的关系(警告描述清楚地说明了这一点(。
最干净的方法是改变red
的类型,但如果你不能,铸造应该足够好。另一方面,使用Enum<Color>
更冗长,并且不会增加代码的清晰度,因此我将调查是否需要以这种方式声明它。