簡體   English   中英

Enum.valueOf(Class <T> enumType,String name)問題

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

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