作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
假设我有一个接口(interface) com.mycompany.SomeInterface
, 和一个枚举 com.mycompany.SomeEnum implements SomeInterface
.我想获取此类的所有枚举常量——作为 SomeInterface
的实例– 在运行时使用反射 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
}
上面的代码似乎有效,但我在创建 castClass
时收到编译器警告.
那么,我的问题是:根据我的检查,代码中注明的两种类型转换(对类的转换和对常量的转换)是否一定有效?
换句话说,是 Enum<? extends T>
的每个成员保证执行T
?
如果答案是“是的,转换是安全的”,那么为什么编译器会给我这个警告?
如果不是,为什么不呢?或者,例程在什么情况下会失败?
编辑:由于我上面的代码显然令人困惑,下面是我对应该发生的事情的解释:
SomeEnum
的类在包裹中 com.mycompany
并存储它的 Class
变量中的对象。SomeInterface
界面。SomeInterface
的枚举, 将其转换为 Class<? extends Enum<? extends SomeInterface>>
– Actor #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
这避免了警告,因为 asSubclass
已检查并 getEnumConstants
如果 Class
对象“不代表枚举类型”,则返回 null
。
关于java - 枚举、类、反射和泛型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13466737/
我是一名优秀的程序员,十分优秀!