2 つのインターフェースが与えられます:
public interface BaseInterface<T> { }
public interface ExtendedInterface<T0, T1> extends BaseInterface<T0> {}
そして具体的なクラス:
public class MyClass implements ExtendedInterface<String, Object> { }
BaseInterface インターフェースに渡される型パラメータを見つけるにはどうすればよいですか?
(ExtendedInterface型パラメータを取得するには、次のように呼び出します。
MyClass.class.getGenericInterfaces()[0].getActualTypeArguments()
しかし、基本的なジェネリック インターフェイスに再帰して意味のあるものを取得する簡単な方法を見つけることができません。
ベストアンサー1
この問題は、一般的に完全に解決するのは簡単ではありません。たとえば、内部クラスの場合は、包含クラスの型パラメータも考慮する必要があります。
ジェネリック型のリフレクションはJava自体が提供する機能だけでは難しいため、私はその面倒な作業を行うライブラリgentyrefを作成しました。http://code.google.com/p/gentyref/たとえば、gentyref を使用すると、次の操作を実行できます。
Type myType = MyClass.class;
// get the parameterized type, recursively resolving type parameters
Type baseType = GenericTypeReflector.getExactSuperType(myType, BaseInterface.class);
if (baseType instanceof Class<?>) {
// raw class, type parameters not known
// ...
} else {
ParameterizedType pBaseType = (ParameterizedType)baseType;
assert pBaseType.getRawType() == BaseInterface.class; // always true
Type typeParameterForBaseInterface = pBaseType.getActualTypeArguments()[0];
System.out.println(typeParameterForBaseInterface);
}