繁体   English   中英

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

[英]Usage of Enum<> generic type for variables

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

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)

如果我们假设我们无法将变量red Enum<Color>更改为Color ,那么这是修正此警告的正确方法吗?

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

Enum类似于Class ,它不是enum Color的实体,而是它的类型,因此Enum<Color>Class<Color>的类似构造...

您的Enum<Color> red = Color.RED; 线条没什么意义。
它应该是Color red = Color.RED; ...

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

正如你可以从这里读到的那样, Enum<?>是每个枚举的父亲。

这里的问题是FindBugs现在只有:

  • 该列表包含Color类型的元素
  • 您正在尝试使用Enum类型

这肯定是一个案例,FindBugs正在对你知道并不真正危险的事情发出警告,可能是因为它无法推断ColorEnum<Color>之间的关系(警告描述清楚地说明了这一点。)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM