Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java:获取枚举的反射_Java_Reflection_Enums - Fatal编程技术网

java:获取枚举的反射

java:获取枚举的反射,java,reflection,enums,Java,Reflection,Enums,这类似于但不完全相同 我有一个映射getEnum(字符串enumFullName){ ... Class cl=(Class)Class.forName(enumClassName); // 1 返回Enum.valueOf(cl,enumName); // 2 } 警告: - Type safety: Unchecked cast from Class<capture#3-of ?> to Class<Enum> - Enum is a raw type. R

这类似于但不完全相同

我有一个
映射getEnum(字符串enumFullName){
...
Class cl=(Class)Class.forName(enumClassName);
// 1
返回Enum.valueOf(cl,enumName);
// 2
}
  • 警告:

      - Type safety: Unchecked cast from Class<capture#3-of ?> to Class<Enum>
      - Enum is a raw type. References to generic type Enum<E> should be parameterized
      - Enum is a raw type. References to generic type Enum<E> should be parameterized
      - Unnecessary cast from Class<capture#3-of ?> to Class<?>
    
    -类型安全:未选中从一个类到另一个类的强制转换
    -枚举是原始类型。对泛型类型枚举的引用应参数化
    -枚举是原始类型。对泛型类型枚举的引用应参数化
    -从一个班级到另一个班级
    
  • 错误:

    - Type mismatch: cannot convert from capture#5-of ? to Enum<?>
    - Type safety: Unchecked invocation valueOf(Class<Enum>, String) of the generic method 
     valueOf(Class<T>, String) of type Enum
    - Bound mismatch: The generic method valueOf(Class<T>, String) of type Enum<E> is not 
     applicable for the arguments (Class<capture#5-of ?>, String). The inferred type capture#5-of ? is not 
     a valid substitute for the bounded parameter <T extends Enum<T>>
    
    -类型不匹配:无法从捕获转换#5-of?列举
    -类型安全:泛型方法的未选中调用valueOf(类,字符串)
    枚举类型的valueOf(类,字符串)
    -绑定不匹配:Enum类型的泛型方法valueOf(类,字符串)不匹配
    适用于参数(类、字符串)。推断的类型捕获#5-of?不是
    有界参数的有效替换
    
  • 这是:

    static private Enum<?> getEnum(String enumFullName) {
       ...
      Class<Enum<?>> cl = (Class<Enum<?>>)Class.forName(enumClassName);
      // 1
      return Enum.valueOf(cl, enumName);
      // 2
    
    静态私有枚举getEnum(字符串enumFullName){
    ...
    类到类不是有界参数的有效替代品
    对于#1,除了
    SuppressWarnings(“unchecked”)
    之外,没有其他解决方案

    对于#2,声明有一个问题:

    static private <E extends Enum<E>> E getEnum(String enumFullName)
    
    因为这会起作用,而且更公平。您会在每个呼叫站点上收到警告,这是正确的,因为有一些东西需要警告。

    签名

    static private <E extends Enum<E>> getEnum(String enumFullName)
    
    但是,这没有任何意义……如果调用方知道方法将返回什么类型的
    enum
    ,他们可以做一些更明智的事情,比如
    SomeEnum.valueOf(“something”)

    这里唯一有意义的是
    getEnum
    只返回
    Enum
    ,这似乎是您真正想要做的:

    static private Enum<?> getEnum(String enumFullName) {
      String[] x = enumFullName.split("\\.(?=[^\\.]+$)");
      if(x.length == 2) {
        String enumClassName = x[0];
        String enumName = x[1];
        try {
          @SuppressWarnings("unchecked")
          Class<Enum> cl = (Class<Enum>) Class.forName(enumClassName);
          return Enum.valueOf(cl, enumName);
        }
        catch(ClassNotFoundException e) {
          e.printStackTrace();
        }
      }
      return null;
    }
    
    静态私有枚举getEnum(字符串enumFullName){
    字符串[]x=enumFullName.split(“\\.(?=[^\\.]+$”);
    如果(x.length==2){
    字符串enumClassName=x[0];
    字符串enumName=x[1];
    试一试{
    @抑制警告(“未选中”)
    Class cl=(Class)Class.forName(enumClassName);
    返回Enum.valueOf(cl,enumName);
    }
    catch(classnotfounde异常){
    e、 printStackTrace();
    }
    }
    返回null;
    }
    

    上面的编译没有任何警告并且工作正常。强制转换到
    警告被抑制,因为我们知道这样做是不安全的,并且
    Enum。如果具有给定名称的类不是
    Enum
    类,那么valueOf
    将爆炸,而这正是我们想要做的。

    您可以返回
    E
    ,并且编译器确定它的一种方法…它与所有泛型方法的类型参数一样,是在调用站点确定的。通常,它是根据传递给该方法的一些参数确定的(通常只有这样使用泛型方法才有意义)但它也可以根据返回值的使用方式来确定。不过,正如我所说的,这样做通常没有意义,因为它通常是一个
    ClassCastException
    正在等待发生。同意。我将其更改为
    静态私有枚举getEnum(字符串enumFullName){…@SuppressWarnings(“未选中”)final Class cl=(Class)Class.forName(enumClassName);@SuppressWarnings(“未选中”)final Enum result=Enum.valueOf(cl,enumName);return result;}
    但实际上我最好用SuppressWarnings注释整个方法,因为如果类名表示没有枚举,它可能抛出ClassCastException。“只要将其更改为…Enum”--这不起作用,我事先尝试过,更糟的是,它会出错。是的,请参阅我以前的评论。哦--好的,谢谢!因为您的评论而被接受以修复它。“只需将其更改为…Enum”--这不起作用,我事先试过了,更糟糕的是,它给出了一个错误。@Jason S:Nevermind,正如@maaartinus评论的那样,使用
    Class
    作为您强制转换到的类的类型,而不是
    Class
    
    static private Enum<?> getEnum(String enumFullName)
    
    static private <E extends Enum<E>> getEnum(String enumFullName)
    
    SomeEnum e = getEnum("com.foo.SomeOtherEnum.SOMETHING"); // ClassCastException!
    
    static private Enum<?> getEnum(String enumFullName) {
      String[] x = enumFullName.split("\\.(?=[^\\.]+$)");
      if(x.length == 2) {
        String enumClassName = x[0];
        String enumName = x[1];
        try {
          @SuppressWarnings("unchecked")
          Class<Enum> cl = (Class<Enum>) Class.forName(enumClassName);
          return Enum.valueOf(cl, enumName);
        }
        catch(ClassNotFoundException e) {
          e.printStackTrace();
        }
      }
      return null;
    }