【问题标题】:Get the value of a generic declaration programmatically?以编程方式获取泛型声明的值?
【发布时间】:2015-07-21 14:02:24
【问题描述】:

我声明一个类如下:

public class SomeClass extends AdditionalClass<GenericClass> {
  ...
}

这...

SomeClass object = new SomeClass();
System.out.println(object.getSuperClass().getSimpleName());

...产生“AdditionalClass”。什么方法调用或调用可以让我询问该对象并获得“GenericClass”作为结果?

【问题讨论】:

  • 与您的问题无关,但您为什么要检查泛型类型?
  • 我以编程方式从应用程序中提取声明,以便可以在整洁的电子表格中将它们提供给非技术用户。
  • 好的。我只是想确保您没有为更简单的任务走错路。也就是说,为什么非技术用户会关心泛型类型?
  • 这引发了更多问题。 “非技术用户”如何处理这些明显非常技术性的信息?
  • 秘诀,我的朋友们。 秘方.

标签: java generics reflection


【解决方案1】:

您必须获取超类的ParameterizedType(s) 数组。例如:

SomeClass object = new SomeClass();
Type parameterizedClassType = 
         ((ParameterizedType) object.getClass().getGenericSuperclass())
         .getActualTypeArguments()[0];
System.out.println(parameterizedClassType.getTypeName());

这应该打印com.whateverpackage.GenericClass

请注意,即使在编译SomeClass 时会发生类型擦除,有关超类的类型参数信息也会被保留,因为它们是类定义的部分

但是,如果SomeClass 是一个通用的(即类似于SomeClass&lt;X&gt; extends AdditionalClass&lt;GenericClass&gt;),那么对于所有SomeClass 实例,类型参数(即&lt;X&gt;)将被替换为一些实际类型, 不会.getActualTypeParameters()数组的一部分。

【讨论】:

  • GenericClass 本身是泛型类型时,这是否有效?即 List
  • 我同意 ;) 但是,如果您将 parameterizedClassType 转换为 Class,它将不起作用。但只要您使用Type,一切都应该没问题。
猜你喜欢
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2019-07-08
  • 2010-10-05
  • 1970-01-01
相关资源
最近更新 更多