Enum<>的使用变量的泛型类型

时间:2017-08-22 14:04:48

标签: java enums findbugs

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

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

2 个答案:

答案 0 :(得分:5)

EnumClass类似,它不是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对你知道并不真正危险的事情发出警告,可能是因为它无法推断ColorEnum<Color>之间的关系(警告说明)明确指出。)

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