java:获取枚举的反射
这类似于但不完全相同 我有一个java:获取枚举的反射,java,reflection,enums,Java,Reflection,Enums,这类似于但不完全相同 我有一个映射getEnum(字符串enumFullName){ ... Class cl=(Class)Class.forName(enumClassName); // 1 返回Enum.valueOf(cl,enumName); // 2 } 警告: - Type safety: Unchecked cast from Class<capture#3-of ?> to Class<Enum> - Enum is a raw type. R
映射getEnum(字符串enumFullName){
...
Class cl=(Class)Class.forName(enumClassName);
// 1
返回Enum.valueOf(cl,enumName);
// 2
}
- Type safety: Unchecked cast from Class<capture#3-of ?> to Class<Enum>
- Enum is a raw type. References to generic type Enum<E> should be parameterized
- Enum is a raw type. References to generic type Enum<E> should be parameterized
- Unnecessary cast from Class<capture#3-of ?> to Class<?>
-类型安全:未选中从一个类到另一个类的强制转换
-枚举是原始类型。对泛型类型枚举的引用应参数化
-枚举是原始类型。对泛型类型枚举的引用应参数化
-从一个班级到另一个班级
- Type mismatch: cannot convert from capture#5-of ? to Enum<?>
- Type safety: Unchecked invocation valueOf(Class<Enum>, String) of the generic method
valueOf(Class<T>, String) of type Enum
- Bound mismatch: The generic method valueOf(Class<T>, String) of type Enum<E> is not
applicable for the arguments (Class<capture#5-of ?>, String). The inferred type capture#5-of ? is not
a valid substitute for the bounded parameter <T extends Enum<T>>
-类型不匹配:无法从捕获转换#5-of?列举
-类型安全:泛型方法的未选中调用valueOf(类,字符串)
枚举类型的valueOf(类,字符串)
-绑定不匹配:Enum类型的泛型方法valueOf(类,字符串)不匹配
适用于参数(类、字符串)。推断的类型捕获#5-of?不是
有界参数的有效替换
static private Enum<?> getEnum(String enumFullName) {
...
Class<Enum<?>> cl = (Class<Enum<?>>)Class.forName(enumClassName);
// 1
return Enum.valueOf(cl, enumName);
// 2
静态私有枚举getEnum(字符串enumFullName){
...
类到类不是有界参数的有效替代品
对于#1,除了SuppressWarnings(“unchecked”)
之外,没有其他解决方案
对于#2,声明有一个问题:
static private <E extends Enum<E>> E getEnum(String enumFullName)
因为这会起作用,而且更公平。您会在每个呼叫站点上收到警告,这是正确的,因为有一些东西需要警告。签名
static private <E extends Enum<E>> getEnum(String enumFullName)
但是,这没有任何意义……如果调用方知道方法将返回什么类型的enum
,他们可以做一些更明智的事情,比如SomeEnum.valueOf(“something”)
这里唯一有意义的是getEnum
只返回Enum
,这似乎是您真正想要做的:
static private Enum<?> getEnum(String enumFullName) {
String[] x = enumFullName.split("\\.(?=[^\\.]+$)");
if(x.length == 2) {
String enumClassName = x[0];
String enumName = x[1];
try {
@SuppressWarnings("unchecked")
Class<Enum> cl = (Class<Enum>) Class.forName(enumClassName);
return Enum.valueOf(cl, enumName);
}
catch(ClassNotFoundException e) {
e.printStackTrace();
}
}
return null;
}
静态私有枚举getEnum(字符串enumFullName){
字符串[]x=enumFullName.split(“\\.(?=[^\\.]+$”);
如果(x.length==2){
字符串enumClassName=x[0];
字符串enumName=x[1];
试一试{
@抑制警告(“未选中”)
Class cl=(Class)Class.forName(enumClassName);
返回Enum.valueOf(cl,enumName);
}
catch(classnotfounde异常){
e、 printStackTrace();
}
}
返回null;
}
上面的编译没有任何警告并且工作正常。强制转换到
类
警告被抑制,因为我们知道这样做是不安全的,并且Enum。如果具有给定名称的类不是Enum
类,那么valueOf
将爆炸,而这正是我们想要做的。您可以返回E
,并且编译器确定它的一种方法…它与所有泛型方法的类型参数一样,是在调用站点确定的。通常,它是根据传递给该方法的一些参数确定的(通常只有这样使用泛型方法才有意义)但它也可以根据返回值的使用方式来确定。不过,正如我所说的,这样做通常没有意义,因为它通常是一个ClassCastException
正在等待发生。同意。我将其更改为静态私有枚举getEnum(字符串enumFullName){…@SuppressWarnings(“未选中”)final Class cl=(Class)Class.forName(enumClassName);@SuppressWarnings(“未选中”)final Enum result=Enum.valueOf(cl,enumName);return result;}
但实际上我最好用SuppressWarnings注释整个方法,因为如果类名表示没有枚举,它可能抛出ClassCastException。“只要将其更改为…Enum”--这不起作用,我事先尝试过,更糟的是,它会出错。是的,请参阅我以前的评论。哦--好的,谢谢!因为您的评论而被接受以修复它。“只需将其更改为…Enum”--这不起作用,我事先试过了,更糟糕的是,它给出了一个错误。@Jason S:Nevermind,正如@maaartinus评论的那样,使用Class
作为您强制转换到的类的类型,而不是Class
static private Enum<?> getEnum(String enumFullName)
static private <E extends Enum<E>> getEnum(String enumFullName)
SomeEnum e = getEnum("com.foo.SomeOtherEnum.SOMETHING"); // ClassCastException!
static private Enum<?> getEnum(String enumFullName) {
String[] x = enumFullName.split("\\.(?=[^\\.]+$)");
if(x.length == 2) {
String enumClassName = x[0];
String enumName = x[1];
try {
@SuppressWarnings("unchecked")
Class<Enum> cl = (Class<Enum>) Class.forName(enumClassName);
return Enum.valueOf(cl, enumName);
}
catch(ClassNotFoundException e) {
e.printStackTrace();
}
}
return null;
}