注釈プロセッサを使用して、注釈付きクラスのメソッドの戻り値の型に応じてソース コードを生成するツールを作成しています。A戻り値の型は常に、型変数を定義するインターフェイスのサブタイプ (インターフェイスまたはクラス)ですT。
interface A<T>{T m();};
m()メソッドの戻り値型 variableの型パラメーターを見つけたいと思いますT。
戻り値の型は、注釈プロセッサによってインスタンスとして表されjavax.lang.model.type.TypeMirrorます。A<T>最も単純なケースは、直接戻ることです。
@SomeAnnotation
class SomeClass{
A<T> x();
}
検出するプロセッサ コードTは非常に単純です。(コードをシンプルにするために、ここではビジター API を使用する代わりにキャストします。)
DeclaredType type = (DeclaredType) typeMirror;
TypeMirror t = type.getTypeArguments().get(0);
TypeMirror戻り型の は aでjavax.lang.model.type.DeclaredTypeありT、最初の型引数です。結果tはjavax.lang.model.type.TypeVariableforTです。同じことが具体的な戻り値の型A<B>( Bis some type: interface B{}) に対しても機能します。の結果tは をDeclaredType表していBます。
他の結果タイプでは事態が複雑になり始めます。
interface Subtype<T> extends A<T>{}
interface Concrete extends A<B>{};
interface Multiple<B,T> extends A<T>{}
interface Bounds<T extends B> extends A<T>{}
interface Hierarchy extends Concrete{}
Subtype<B> -> DeclaredType B
Subtype<T> -> TypeVariable T
Concrete -> DeclaredType B
Multiple<B,T> -> TypeVariable T or DeclaredType B depeding on Multiple
Multiple<B,B> -> TypeVariable B
<T extends B> A<T> -> TypeVariable T with super class bound B
Bound<B> -> DeclaredType B
Bound<C> -> DeclaredType C (subtype of B)
Hierarchy -> TypeVariable T
TJava型システム全体をミラーリングせずに正しい型パラメータを見つける方法はありますか?