簡體   English   中英

我該如何構造一個泛型argargs的EnumSet?

[英]How can I construct an EnumSet of generic varargs?

假設我要執行以下操作:

public static <V> Set<V> setOf(V... elem)
{
    Set<V> set = null;  
    if (elem[0] instanceof Enum)
        set = Sets.newEnumSet(elem, elem[0].getClass());  OR
        set = EnumSet.<V>noneOf(elem[0].getClass());
    return set;
}

這些或其他幾種變體似乎都不起作用。 有人可以向我解釋發生了什么嗎? 我看過如何獲取通用枚舉的類型對象? 和其他一些類似的問題,但我仍然無法解決這個問題。

首先,您需要確保類型V被限制為枚舉類型。 您可以通過指定V必須extends Enum<V>

然后,您將需要提供枚舉類型的Class 由於類型擦除,您將無法在運行時派生它。 這是必需的,因為要構造一個新的空EnumSet ,您需要指定元素的類型。

最后,您有幾種創建集合的方法,但是最簡單的方法是使用Stream API:

@SafeVarargs
public static <V extends Enum<V>> Set<V> setOf(Class<V> enumClass, V... elem) {
    return Arrays.stream(elem).collect(Collectors.toCollection(() -> EnumSet.noneOf(enumClass)));
}

請注意,如果可以保證至少有1個元素,則可以使用EnumSet.copyOf(Arrays.asList(elem))而不需要傳遞類。

如果無法將通用參數綁定到V extends Enum<V> ,則可以使可編譯代碼如下:

public <V> Set<V> setOf(V... elem) {
    Set<V> set = null;
    if (elem[0].getClass().isEnum()) {
        set = (Set<V>) EnumSet.copyOf((Collection<Enum>)Arrays.asList(elem)) ;
    }
    return set;
}

當然,會有不安全的強制警告。


我還將類型的檢查更改為:

if (elem[0].getClass().isEnum())

哪個恕我直言更干凈。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM