JavaでListのジェネリック型を取得する方法は何ですか?
Javaでは、Listのジェネリック型を直接取得することができません。なぜなら、ジェネリックはコンパイル時に型が消去されるため、実行時に具体的なジェネリック型情報を取得できないからです。
しかし、Listのジェネリック型情報はいくつかの間接的な方法で取得することができます。一般的な方法は反射を使用して取得することです。
以下は、Listのジェネリック型をリフレクションを使用して取得する方法を示すサンプルコードです。
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
Type genericType = list.getClass().getGenericSuperclass();
if (genericType instanceof ParameterizedType) {
Type[] actualTypeArguments = ((ParameterizedType) genericType).getActualTypeArguments();
if (actualTypeArguments.length > 0) {
Class<?> genericClass = (Class<?>) actualTypeArguments[0];
System.out.println("List泛型类型为: " + genericClass.getName());
}
}
}
}
上記のコードでは、まずListのClassオブジェクトを取得し、その親クラスのジェネリック型情報を取得します。ジェネリック型がParameterizedTypeタイプである場合、つまり実際の型パラメータを持つジェネリック型の場合、getActualTypeArguments()メソッドを呼び出すことで実際の型パラメータの配列を取得できます。配列の最初の要素がListのジェネリック型です。
上記のコードでは、ListがArrayListから直接継承していると仮定していますが、Listが他のクラスを継承していたり、他のインターフェースを実装している場合、getGenericSuperclass()メソッドを調整する必要があります。また、Listにジェネリック型が指定されていない場合、getActualTypeArguments()メソッドは長さ0の配列を返しますので、そうした点にも注意が必要です。