【问题标题】:get class object of actual generic type in a static method在静态方法中获取实际泛型类型的类对象
【发布时间】:2014-10-22 21:35:21
【问题描述】:

我有一个泛型静态方法,我希望它返回插入的实际泛型类型的 Class 对象。

我试过这样:

@SuppressWarnings("unchecked")
public static <T> Class<T> getClassType() {

    Method thisMethod;
    try {
        thisMethod = CommonTools.class.getMethod("getClass", new Class<?>[0]);
    } catch (Exception ex) {
        //ErrorLog.error(ex.getMessage(), ex);
        return null;
    }

    Type returnType = thisMethod.getGenericReturnType();
    Type tType = returnType.getClass().getGenericSuperclass();
    ParameterizedType parameterizedType = (ParameterizedType) tType;
    Class<T> clazz = (Class<T>) parameterizedType.getActualTypeArguments()[0];

    return clazz;
}

我的灵感是在 google code morphia library 中找到的,他们在那里使用了这样的东西:

(((Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]))

我的代码和他们的代码之间的区别在于他们调用它是为了在类中查找泛型类型 - 我希望它用于方法中。

我的代码不起作用,它属于(类)转换行。

您对如何从静态方法获取当前泛型类型有任何想法吗?

谢谢

【问题讨论】:

  • 如果我没记错的话,为什么 应该是 public static Class getClassType() 的 2 倍。
  • 该方法应该如何知道 T 是一个泛型参数?
  • 我认为您可以使用 创建一个类族。你也可以写一个工厂,给你的父类一个类型枚举,并使用工厂根据传递的枚举值将你的类转换为特定的类型。
  • 我想从静态类中使用它,你的解决方案不是我想要的

标签: java generics types static


【解决方案1】:

它不会起作用。你得到方法getClass,它基本上有返回类型Class&lt;CommonTools&gt;,然后你调用getActualTypeArguments,它将返回Class&lt;CommonTools&gt;,因为TypeArgument是CommonTools。

如果你打电话给Class&lt;CommonTools&gt; ct = getClassType();,它会起作用,但是没有这样的信息是没有意义的。

据我所知,没有办法获取该信息,因为 JVM 在运行时会擦除所有通用信息。 最简单的解决方案是CommonTools 将在创建时获取Class&lt;T&gt; 实例,并将其返回,但这并不常见。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 2013-09-13
  • 2015-06-04
  • 2017-06-07
  • 1970-01-01
相关资源
最近更新 更多