繁体   English   中英

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

[英]How to find the class object of Java generic type?

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

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

这将导致编译错误,因为P.class无效。 那么,为了使上述代码有效,我该怎么办?

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

例如

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

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

有关类型擦除的好答案,请查看此问题

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

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

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

    //setter and getter

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM