枚举的用法<>变量的泛型类型



我们的代码有点类似于下面,其中我们有枚举,我们检查该枚举类型的给定变量是否存在于该枚举类型的列表中。

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>更改为可变redColor,那是否是解决此警告的正确方法。

更新:我们不能自由更改变量的原因是 - 在实际代码中,我们有一个 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 对你知道并不真正危险的东西发出警告的情况,可能是因为它无法推断ColorEnum<Color>之间的关系(警告描述清楚地说明了这一点(。

最干净的方法是改变red的类型,但如果你不能,铸造应该足够好。另一方面,使用Enum<Color>更冗长,并且不会增加代码的清晰度,因此我将调查是否需要以这种方式声明它。

最新更新