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

Wan*_*ker 5 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));
    }

}
Run Code Online (Sandbox Code Playgroud)

我们的QA团队针对此代码运行FindBugs,并且他们已经标记了一个警告 - GC_UNRELATED_TYPES,其中声明了

GC:泛型参数和方法参数之间没有关系(GC_UNRELATED_TYPES)

对泛型集合方法的这种调用包含一个带有与集合参数不兼容的类的参数(即,参数的类型既不是超类型也不是相应泛型类型参数的子类型).因此,集合不太可能包含与此处使用的方法参数相同的任何对象.最有可能的是,错误的值被传递给该方法.

我的问题是什么是类型的变量的使用Enum<EnumClass>,并且应该修复FindBug警告.我们目前正计划通过使用类型转换来解决它.

 colorList.contains((Color) red)
Run Code Online (Sandbox Code Playgroud)

那会是,如果我们假设我们不能随意改变固定这一警告的正确的方式Enum<Color>Color为变量red.

更新: 我们无法自由更改变量的原因是 - 在实际代码中,我们有一个GUI可重用控件EnumListBox- 并且它似乎被设计为可以与任何枚举一起使用 - 因此,当我们从EnumListBox创建特定用途继承时-我们必须覆盖一个接受类型参数的方法,让我们说Enum<Color>.

Usa*_*oto 5

Enum就像Class,它不是它的实体enum Color,而是它的类型,因此Enum<Color>是一个类似的结构Class<Color>......

你的Enum<Color> red = Color.RED;线条没什么意义.
应该Color red = Color.RED;......

另见Joop Eggen的评论......

  • 更多解释:`Enum <Color>`是`enum Color {...}`的合成基类.因此,任务有效.在contains中,需要Color的_child_ class元素,而不是父类Enum,假设它不是Color. (4认同)