簡體   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