[英]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.