Javaでは、ジェネリック型Tのクラスを取得する方法は何ですか?

Javaでは、型消去の制約のため、ジェネリック型のClassオブジェクトを直接取得することはできませんが、以下の2つの方法でジェネリック型のClassオブジェクトを取得することができます。

  1. Classパラメータを渡すことで、ジェネリック型のClassオブジェクトを取得します。
public class MyClass<T> {
    private Class<T> type;
    
    public MyClass(Class<T> type) {
        this.type = type;
    }
    
    public Class<T> getType() {
        return type;
    }
}

// 使用示例
MyClass<String> myClass = new MyClass<>(String.class);
Class<String> stringClass = myClass.getType();

上記の例では、ジェネリック型のClassオブジェクトを取得するために、コンストラクタでClassパラメータを渡し、メンバ変数に保存し、getTypeメソッドを使用してそのClassオブジェクトを取得します。

  1. ジェネリック型のClassオブジェクトを取得するためにリフレクションを使用します。
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class MyClass<T> {
    public Class<T> getType() {
        Type type = getClass().getGenericSuperclass();
        ParameterizedType paramType = (ParameterizedType) type;
        Type[] actualTypeArguments = paramType.getActualTypeArguments();
        return (Class<T>) actualTypeArguments[0];
    }
}

// 使用示例
MyClass<String> myClass = new MyClass<String>();
Class<String> stringClass = myClass.getType();

上記の例では、リフレクションを使用してジェネリック型のClassオブジェクトを取得することができます。まず、getClassメソッドを使用して現在のオブジェクトのClassオブジェクトを取得し、次にgetGenericSuperclassメソッドを使用してそのClassオブジェクトの親クラスのTypeオブジェクトを取得し、次にそのTypeオブジェクトがParameterizedType型であるかどうかを判断します。その場合は、getActualTypeArgumentsメソッドを使用して実際の型引数のTypeオブジェクト配列を取得し、最後にClassオブジェクトに強制変換してジェネリック型のClassオブジェクトを取得します。

第2の方法でジェネリック型のClassオブジェクトを取得する際には、サブクラスで引数なしのコンストラクタを実装する必要があり、そうでない場合にはClassCastException例外が発生します。

bannerAds