java – 枚举,类,反射和通用铸造
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 枚举,类,反射和通用铸造,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2115字,纯文字阅读大概需要4分钟。
内容图文
![java – 枚举,类,反射和通用铸造](/upload/InfoBanner/zyjiaocheng/722/01b6ad4921bd489a939c559434d31240.jpg)
考虑一下我有一个接口com.mycompany.SomeInterface,一个枚举com.mycompany.SomeEnum实现了SomeInterface.我希望在运行时使用Reflection API获取此类的所有枚举常量 – 作为SomeInterface的实例.
目前,我的代码(在类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的每个成员<?延伸T>保证实施T?
如果答案是“是的,演员阵容是安全的”,那么为什么编译器会给我这个警告呢?
如果没有,为什么不呢?或者,在什么情况下例程会失败?
编辑:由于上面的代码显然令人困惑,这里是我对应该发生的事情的解释:
>在com.mycompany包中加载名为SomeEnum的类,并将其Class对象存储在变量中.
>确保引用的类实现SomeInterface接口.
>确保引用的类是枚举.
>我们知道它是实现SomeInterface的枚举,将其强制转换为Class<?延伸Enum<?扩展SomeInterface>> – 演员阵容#1
>遍历所有枚举常量.
>对于每个常量,将其强制转换为SomeInterface – 强制转换#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,如果Class对象“不表示枚举类型”,则getEnumConstants返回null.
内容总结
以上是互联网集市为您收集整理的java – 枚举,类,反射和通用铸造全部内容,希望文章能够帮你解决java – 枚举,类,反射和通用铸造所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。