java - 正确地转换泛型

标签 java generics

我怎么投 Class<? extends Enum<?>>Class<T> , 其中<T extends Enum<T>> ?具体来说,我需要传递 Class<? extends Enum<?>> 的一个实例到 Enum.valueOf()方法。 http://docs.oracle.com/javase/7/docs/api/java/lang/Enum.html#valueOf(java.lang.Class,%20java.lang.String)

这是我的类(class):

enum Foo1 implements Bar {
  VALUE1("A"), VALUE2("B");

  String me;

  Foo1(String me) { 
    this.me = me;
  }

  String getMe() {return me;}
}

enum Foo2 implements Bar {
  V1("A"), V2("B");

  String me;

  Foo2(String me) { 
    this.me = me;
  }

  String getMe() {return me;}
}

interface Bar {
  String getMe();
}

enum Z { 
  Z1(Foo1.class), Z2(Foo2.class);
  private final Class<? extends Enum<? extends Bar>> myEnum;
  Z(Class<? extends Enum<? extends Bar>> myEnum) {
     this.myEnum = myEnum;
  }

  Class<? extends Enum<? extends Bar>> getMyEnum() {
     return myEnum;
  }
}

class X {
   public getMe(Z z, String fooValue) {
       Class<? extends Enum<? extends Bar>> fooEnum = z.getMyEnum();
       // does not compile
       return ((Bar)Enum.valueOf(fooEnum, fooValue)).getMe();
   }
}

最佳答案

执行此操作的简单方法是转换为原始类型 Class:

return ((Bar)Enum.valueOf((Class)fooEnum, fooValue)).getMe();

如果您不喜欢转换,您可以在将枚举类放入 Z 中时将它们包装在另一个类中,以保留更多它们的类型关系。

enum Z {
    Z1(new Holder<>(Foo1.class)), Z2(new Holder<>(Foo2.class));
    private final Holder<?> myEnum;

    Z(Holder<?> myEnum) {
        this.myEnum = myEnum;
    }
    Holder<?> getMyEnumHolder() {
        return myEnum;
    }

    static class Holder<T extends Enum<T> & Bar> {
        private final Class<T> myEnum;

        private Holder(Class<T> myEnum) {
            this.myEnum = myEnum;
        }

        Class<T> getMyEnum() {
            return myEnum;
        }
    }
}

class X {
    public static String getMe(Z z, String fooValue) {
        return Enum.valueOf(z.getMyEnumHolder().getMyEnum(), fooValue).getMe();
    }
}

关于java - 正确地转换泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26416888/

相关文章:

c# - 我可以在泛型类中使用 T 的静态字段吗

java - 如何在不知道 .class 先验的情况下使用 Gson 在 Java 中反序列化和返回 JSON 中的对象?

java - 在 Kotlin 函数类型中表达 "super"泛型?

java - 如何使用 GUI intelliJ 显示框架

java - 嵌套同步块(synchronized block)的缺点

java - Eclipse 调试问题

java - 如何在 JSP 中打印双引号?

java - 通用工厂和映射值

java - 简单连接 Spring Roo - 两个实体合而为一

c# - "foreach"VS "List<T>.Foreach"...哪个赢了