簡體   English   中英

當枚舉類型引用是一個類時,如何將String轉換為枚舉值 <?> ?

[英]How to convert String to enum value when enum type reference is a Class<?>?

我有使用setter方法在對象上設置值的代碼。 其中一個setter將Enum類型作為方法參數。 代碼看起來像這樣:

    String value = "EnumValue1";
    Method setter = getBeanWriteMethod("setMyEnumValue");
    Class<?> type = setter.getParameterTypes()[0];
    Object convertedValue = null;
    if (type.isEnum()) {
       convertedValue = convertToEnum(value, type);
    } else {
       convertedValue = ClassUtils.convertType(value, type);
    }
    return convertedValue;

問題是在convertToEnum方法中放入什么。 我知道我可以通過迭代type對象的枚舉常量(或字段)來“強制它”,匹配值。 我是否忽略了使用Reflection進行更簡單的方法? (我查看了幾個例子,但沒有找到任何枚舉只能通過Class知道的地方)。

脫離我的頭頂:

  Enum<?> convertedValue = Enum.valueOf((Class<Enum>)type,  value);

這會將字符串轉換為類型的Enum類的枚舉常量

編輯 :現在我有一台電腦方便,我可以看到實際上有什么用。 在沒有編譯器警告的情況下,以下任一情況都正確運行:

Enum<?> convertedValueA = Enum.valueOf(type, value);
Enum<?> convertedValueB = Enum.valueOf(type.asSubclass(Enum.class), value);

第二個調用asSubClass(),它會進行運行時檢查以確保該type是一些枚舉類,但valueOf()方法必須進行檢查才能正常工作。

以下給了我一個編譯錯誤:

Enum<?> convertedValueC = Enum.valueOf((Class<? extends Enum <?>>)type, value);

java: Foo.java:22: <T>valueOf(java.lang.Class<T>,java.lang.String) in java.lang.Enum cannot be applied to (java.lang.Class<capture#134 of ? extends java.lang.Enum<?>>,java.lang.String)

投射到通配符類型的復雜性使我感到困惑所以我可能嘗試過錯誤的演員。 此外,它沒有運行時效果這一事實意味着它很容易弄錯,永遠不會發現。

您可以使用

Class enumType = ....
String name = ....

Enum e = Enum.valueOf(enumType, name);

例如

import java.lang.annotation.*;

public class Main {
    public static void main(String[] args) {
        Class enumType = RetentionPolicy.class;
        String name = "SOURCE";

        Enum e = Enum.valueOf(enumType, name);
        System.out.println(e);
    }
}

版畫

SOURCE
Enum.valueOf(yrEnum, myString)

返回枚舉,其中myString是所需枚舉實例的名稱。 yrEnum.values()返回所有不同可能的Enums實例的數組。

暫無
暫無

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

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