考虑我有一个类型:
interface Foo<T> {
boolean foo();
}
我这样创建BarFoo:
class BarFoo implements Foo<Bar> {
boolean foo();
}
在Java6 Annotation Processor中,可以访问TypeElement BarFoo,如何在实现Foo(特别是Bar)的上下文中发现这个非泛型子类参数化的具体类型。
此外,当我有一个更复杂的层次结构时,如何:
interface Foo<T> {
boolean foo();
}
class BarFoo implements Foo<Bar> {
boolean foo();
}
class Grandchild extends BarFoo {}
如果给出Grandchild的TypeElement,我能找到Foo类型参数的类型吗?
请注意 - 我不需要知道将执行此操作的反射API,但特别是javax.lang.model和javax.annotation.processing API将使我在此方案中Bar
。< / p>
编辑:我将返回类型从T更改为boolean,因为在我的实际案例中,我没有任何返回T的方法可能证明是一种解决方法。遗憾的是,我需要从类型层次结构中获取它,而不是从方法返回类型中获取它。
答案 0 :(得分:4)
我会尝试:
TypeElement.getInterfaces()
- &gt; List<? extends TypeMirror>
TypeMirror.accept(...)
访问者检查DeclaredType
DeclaredType.getTypeArguments()
- &gt; List<? extends TypeMirror>
应为TypeElement
Bar
对于Grandchild
可能是相同的方案,但首先是getSuperclass()
。
另一种选择是从Foo
开始,检查getTypeParameters()
,它会为您提供T
,然后查找T
为getReturnType()
的方法,然后寻找该方法的实现(如果考虑签名而不仅仅是名称,可能不那么容易),最后找出哪个返回类型具有实现。但这更为复杂。