Javaでは、ジェネリック型Tのクラスを取得する方法は何ですか?
Javaでは、型消去の制約のため、ジェネリック型のClassオブジェクトを直接取得することはできませんが、以下の2つの方法でジェネリック型のClassオブジェクトを取得することができます。
- 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オブジェクトを取得します。
- ジェネリック型の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例外が発生します。