gpt4 book ai didi

java - 枚举、类、反射和泛型转换

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:51:56 24 4
gpt4 key购买 nike

假设我有一个接口(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

如果答案是“是的,转换是安全的”,那么为什么编译器会给我这个警告?

如果不是,为什么不呢?或者,例程在什么情况下会失败?

编辑:由于我上面的代码显然令人困惑,下面是我对应该发生的事情的解释:

  1. 加载名为 SomeEnum 的类在包裹中 com.mycompany并存储它的 Class变量中的对象。
  2. 确保引用的类实现了 SomeInterface界面。
  3. 确保引用的类是一个枚举。
  4. 正如我们所知,它是一个实现 SomeInterface 的枚举, 将其转换为 Class<? extends Enum<? extends SomeInterface>> – Actor #1
  5. 遍历所有枚举常量。
  6. 对于每个常量,将其转换为 SomeInterface – 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com