如何找到Java泛型类的类对象?

时间:2010-05-28 13:49:45

标签: java generics enums

假设我有一个通用类型P,它是一个枚举,即<P extends Enum<P>>,我想从字符串中获取Enum值,例如:

String foo = "foo";
P fooEnum = Enum.valueOf(P.class, foo);

这将导致编译错误,因为P.class无效。那么我能做些什么来使上面的代码工作呢?

4 个答案:

答案 0 :(得分:4)

您必须在某处拥有此泛型类型的运行时实例,以便您可以通过Enum#getDeclaringClass()获取声明类。假设您已将P p声明为某个方法参数,这是一个示例。

E.g。

public static <P extends Enum<P>> P valueOf(P p, String name) {
    return Enum.valueOf(p.getDeclaringClass(), name);
}

答案 1 :(得分:3)

Java无法实现。通用类型已擦除并在字节代码中转换为Object。泛型类型(在您的情况下为“P”)不是真正的类,而只是占位符。

请查看this question,并在类型擦除方面找到很好的答案。

答案 2 :(得分:1)

Java使用称为类型擦除的东西来实现泛型。这意味着实际的通用参数在运行时被擦除。因此,您无法从泛型类型参数推断出类型信息。

答案 3 :(得分:0)

您可以通过让调用者或某个配置提供程序在运行时获取它。例如,您可以使用Spring或其他任何配置。

class Converter<P extends Enum> {
    private Class<P> type;

    //setter and getter

    public P valueOf(String name) {
        return Enum.valueOf(type, name);
    }
}

然后在任何需要的地方配置它。