[英]Can't access Enum<?>.valueOf(String) method for generic type (or how to get .class of generic argument)?
[英]How can I get a valueOf generic enum?
我正在嘗試使用默認方法創建一個接口,該方法返回該枚舉的 valueOf(string) 或 null 它沒有任何,因此我可以輕松實現它,而無需粘貼此代碼的非通用變體我需要這樣的東西的課程。 所以我嘗試這樣做,但它不能編譯:
public interface EnumWNull<T extends Enum<T>> {
default T getEnumOrNull(String value){
try {
return Enum.valueOf(T /*Error: expression expected*/, value);
}catch (Exception e){
return null;
}
}
}
我不明白為什么。 而且我實際上知道我可以讀取所有值並手動搜索它,但是為了學習和優雅,我想知道比這更好的方法(我覺得應該有更好的方法,如果沒有的話) t,valueOf 的靜態變體的目的是什么?)。
如果不傳遞Class
對象,您就無法做到這一點。 您需要模仿Enum.valueOf()
的簽名:
static <T extends Enum<T>> T getEnumOrNull(Class<T> enumType, String name) {
try {
return Enum.valueOf(enumType, name);
} catch (IllegalArgumentException e) {
return null;
}
}
我建議創建一個靜態實用程序方法,而不是使用默認方法實現接口。 @shmosel 的回答很好地做到了這一點,但我建議使用Optional
來傳達該方法可以返回 null (我已經分叉了他的代碼)。
public static <T extends Enum<T>> Optional<T> getEnumValue(Class<T> enumType, String name) {
try {
return Optional.of(Enum.valueOf(enumType, name));
} catch (IllegalArgumentException e) {
return Optional.empty();
}
}
public static <T extends Enum> T getEnumOrNull(Class enumType, String name) { return nonNull(name) ? Enum.valueOf(enumType, name) : null; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.