Why I can not get .values() from Enum object class?
我想为任何枚举对象创建通用方法,该方法将检查枚举是否具有指定的值名称,但是作为Enum类型的对象,我无法使用方法values();。 为什么?
有什么方法可以从Enum类型的对象获取值?
我需要这样的方法来检查配置中的值是否是myEnum.valueOf(String);的有效字符串,因为如果给定的字符串错误,那么它将引发异常(我不希望这样)。
我希望我的方法看起来像这样:
1 2 3
| public static Boolean enumContains (Enum en, String valueString ){
return toStringList (en. values()). contains(valueString. toUpperCase());
} |
但是没有方法Enum.values()。 如何正确创建此方法?
-
您的示例中的Enum是什么?
-
我想使其通用,因此我只将Enum作为参数类型来匹配此方法的任何Enum对象。
-
而values仅适用于Enum类型,例如 MyEnum.values(),但显然不是像您的方法那样为Enum的特定值...
-
好吧,这对于其他枚举无法解释的任何枚举都有效
-
反射也是一种解决方法,但是谁想要对enum类使用反射... getDeclaredField("$VALUES");或Enum.class.getDeclaredMethod("values");
-
那么,如何适当地创建此方法而不将其简化为像MyEnum这样的单一枚举类型呢? 我想为任何枚举对象创建它
-
@AKSW您的hack依赖于枚举的特定实现,而该枚举可能并非对所有Java实现都是正确的。 实际上,getDeclaredField使用反射。
-
@RealSkeptic我知道,从来没有说过这是一个解决方案,也没有提供它作为答案。
Enum#values是由编译器生成的方法,因此除非您传入特定的枚举而不是Enum< ? >,否则不能在编译时使用它。
参见:https://stackoverflow.com/a/13659231/7294647
一种解决方案是改为传入Class>并使用Class#getEnumConstants:
1 2 3
| public static <E extends Enum <E >> Boolean enumContains (Class <E > clazz, String valueString ){
return toStringList (clazz. getEnumConstants()). contains(valueString. toUpperCase());
} |
如果您有一个名为MyEnum的枚举,则只需将MyEnum.class作为第一个参数传入。