我正在尝试编写一种方法,可以在运行时从字符串转换为枚举对象,以获取通用枚举。我有一个方法签名:

public static <T extends Enum<T>> Enum<T> foo(String string, Class<T> clazz)


但是,我从其泛型类型参数未显式扩展Enum的类中调用它。即

class bar<X> {
  private Class<X> clazz;
  if (XIsAnEnum()) {
    foo(string, clazz)
  }
}


这不会编译,因为即使我从XIsAnEnum的逻辑知道X extends Enum<X>,我也没有在通用类型参数定义中明确声明它,所以它不是有效的参数。

有没有办法从Class<X>Class<X extends Enum<X>>进行未经检查的转换,还是我想专门使用枚举时必须专门创建一个新的类bar2<X extends Enum<X>>

最佳答案

您可以使用Class#asSubclass(Class)为您进行转换,例如

foo("value", clazz.asSubclass(Enum.class));


这涉及到实际验证,即clazz引用的是Class的子类Enum

不过,您在这里扔掉了所有通用验证。

关于java - 泛型类的未经检查的类型转换?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34187490/

10-12 00:41
查看更多