注釈プロセッサを使用して、注釈付きクラスのメソッドの戻り値の型に応じてソース コードを生成するツールを作成しています。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.TypeVariable
forT
です。同じことが具体的な戻り値の型A<B>
( B
is 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
T
Java型システム全体をミラーリングせずに正しい型パラメータを見つける方法はありますか?