[英]Enum.valueOf(Class<T> enumType, String name) question
我試圖解決與動態枚舉查找相關的編譯錯誤(“綁定不匹配:...”)。
基本上我想要實現這樣的事情:
String enumName = whatever.getEnumName();
Class<? extends Enum<?>> enumClass = whatever.getEnumClass();
Enum<?> enumValue = Enum.valueOf(enumClass, enumName);
無論我做什么,我總是最終得到編譯錯誤。 老實說,仿制葯和枚舉對我來說是非常令人難以置信的......
我在這做錯了什么?
除非您可以訪問類型變量(通過類型或方法簽名),否則我認為它不會完全相同。 問題是Enum.valueOf
的方法簽名:
public static <T extends Enum<T>> T valueOf(
Class<T> enumType,
String name
);
沒有類型變量就沒有辦法獲得T. 但是如果你願意壓制一些編譯器警告,你可以這樣做:
public enum King{
ELVIS
}
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void main(final String[] args){
final Class<? extends Enum> enumType = King.class;
final Enum<?> theOneAndOnly = Enum.valueOf(enumType, "ELVIS");
System.out.println(theOneAndOnly.name());
}
輸出:
ELVIS
問題是Class<? extends Enum<?>>
Class<? extends Enum<?>>
。 我們希望E extends Enum<E>
,但我們無法得到它,因為我們有兩個不同的通配符。
所以我們需要引入一個通用參數,可以通過調用方法引入:
enum MyEnum {
ME;
}
public class EnName {
public static void main(String[] args) {
Enum<?> value = of(MyEnum.class, "ME");
System.err.println(value);
}
private static <E extends Enum<E>> E of(Class<E> clazz, String name) {
E value = Enum.valueOf(clazz, name);
return value;
}
}
但反思很糟糕,很少你想要的。 不要這樣做。
實際上有一種替代方法:您可以使用Class.getEnumConstants
並滾動自己的Enum.valueOf
實現,它沒有相同的類型問題。 缺點是你得到一個通用的Enum<?>
- 但是如果你知道你進入了什么類型,那么無論如何你都可以使用Enum.valueOf
。
private static Enum<?> findEnumValue(Class<? extends Enum<?>> enumType, String value) {
return Arrays.stream(enumType.getEnumConstants())
.filter(e -> e.name().equals(value))
.findFirst()
.orElse(null);
}
(注意,如果沒有這樣的常量而不是拋出IllegalArgumentException
,我的版本將返回null
,但這是一件很容易改變的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.