问题 以编程方式获取通用声明的值?


我声明一个类如下:

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

这个...

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

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


3798
2017-07-21 14:02


起源

与您的问题无关,但为什么要检查泛型类型? - CKing
我以编程方式从应用程序中提取声明,以便可以在整洁的电子表格中将它们提供给非技术用户。 - IVR Avenger
好的。我只是想确保你没有走错路来完成一项简单的任务。那就是说,为什么非技术用户会关心通用类型呢? - CKing
这引发了更多问题。 “非技术用户”对这些明显非常技术性的信息做了什么? - Holger
秘密酱,我的朋友们。 秘密酱。 - IVR Avenger


答案:


你必须获取数组 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<X> extends AdditionalClass<GenericClass>),然后为所有的 SomeClass 实例类型参数(即 <X>)将被替换为一些实际类型,其中 不会 已经成为了一部分 .getActualTypeParameters() 阵列。


14
2017-07-21 14:08



这有用吗? GenericClass 是一个通用类型本身?即List <String> - Federico Peralta Schaffner
它有效,是的。值得一试:) - Konstantin Yovkov
我在那;)如果你投了这个,它就行不通了 parameterizedClassType 至 Class但是。但只要你与之合作 Type一切都应该没问题。 - Federico Peralta Schaffner