wch*_*gin 3 java reflection enums casting type-safety
考虑一下我有一个接口com.mycompany.SomeInterface和一个枚举com.mycompany.SomeEnum implements SomeInterface.我希望SomeInterface在运行时使用Reflection API 获取此类的所有枚举常量 - 作为实例.
目前,我的代码(在类中EnumConstantGetter)是这样的:
Class<?> clazz = EnumConstantGetter.class.getClassLoader().
loadClass("com.mycompany.SomeEnum");
if (!(SomeInterface.class.isAssignableFrom(clazz)) {
throw new Exception("the class doesn't implement SomeInterface");
}
if (!(clazz.isEnum()) {
throw new Exception("not an enum");
}
Class<? extends Enum<? extends SomeInterface>> castClass =
(Class<? extends Enum<? extends SomeInterface>>) clazz; // cast #1
ArrayList<SomeInterface> vals = new ArrayList<SomeInterface>();
for (Enum<? extends SomeInterface> enumConstant :
castClass.getEnumConstants()) {
vals.add((SomeInterface) enumConstant); // cast #2
}
Run Code Online (Sandbox Code Playgroud)
上面的代码似乎工作,但我在创建时收到编译器警告castClass.
那么我的问题是:代码中注明的两个强制转换(类上的强制转换和常量上的强制转换)是否必须基于我的检查有效?
换句话说,是否每个成员都有Enum<? extends T>保证实施T?
如果答案是"是的,演员阵容是安全的",那么为什么编译器会给我这个警告呢?
如果没有,为什么不呢?或者,在什么情况下例程会失败?
编辑:由于上面的代码显然令人困惑,这里是我对应该发生的事情的解释:
SomeEnum包中指定的类com.mycompany并将其Class对象存储在变量中.SomeInterface接口.SomeInterface,把它投射到一个Class<? extends Enum<? extends SomeInterface>> 演员阵容#1SomeInterface - cast#2 -并将其添加到常量列表中.谢谢!
您可以执行以下操作:
Class<?> clazz = ...;
Class<? extends SomeInterface> someInterfaceClass;
try {
someInterfaceClass = clazz.asSubclass(SomeInterface.class);
}
catch (ClassCastException cce) {
throw new IllegalStateException("Specified type doesn't implement SomeInterface", cce);
}
SomeInterface[] enumConstants = someInterfaceClass.getEnumConstants();
if (enumConstants == null) {
throw new IllegalStateException("Specified type is not an enum.");
}
//use constants
Run Code Online (Sandbox Code Playgroud)
这避免了警告,因为asSubclass被选中,getEnumConstants返回null如果Class对象"不表示枚举类型".