web-dev-qa-db-ja.com

Java型変数からのクラスオブジェクト

Java汎用クラスの型変数からClassオブジェクトを取得する方法はありますか?次のようなものがあります:

public class Bar extends Foo<T> {
    public Class getParameterClass() {
        return T.class; // doesn't compile
    }
}

この型情報はコンパイル時に利用できるため、型消去の影響を受けないようにする必要があります。したがって、理論的には、これを実現する方法が必要です。それは存在しますか?

21

これは機能します:

public static class Bar extends Foo<String> {
  public Class<?> getParameterClass() {
    return (Class<?>) (((ParameterizedType)Bar.class.getGenericSuperclass()).getActualTypeArguments()[0]);
  }
}
25
sfussenegger

コードスニペットは少し紛らわしいです。 Tは型パラメータですか、それともクラスですか?

public static class Bar extends Foo<String> {
    public Class<?> getParameterClass() {
        return (Class<?>) (((ParameterizedType)Bar.class.getGenericSuperclass()).getActualTypeArguments()[0]);
    }
}

public static class Bar2<T> extends Foo<T> {
    public Class<?> getParameterClass() {
        return (Class<?>) (((ParameterizedType)Bar2.class.getGenericSuperclass()).getActualTypeArguments()[0]);
    }
}


public static void main(String[] args) {
    System.out.println(new Bar().getParameterClass());
    System.out.println(new Bar2<Object>().getParameterClass());
}

実際には、2番目のprintlnによって例外が発生します。

6
tkr

このコードは、派生クラスでも機能します。

import Java.lang.reflect.ParameterizedType;

public abstract class A<B> 
{
    public Class<B> getClassOfB() throws Exception 
    {
        ParameterizedType superclass = (ParameterizedType) getClass().getGenericSuperclass();

        return (Class<B>) superclass.getActualTypeArguments()[0];
    }
}

ここから引っ掛かる: https://stackoverflow.com/a/4699117/2651

3
Brad Parks