私は質問への答えを読んでいます:
Lars Bohl によって提案されたアプローチを実装しました。私は彼のコードを次のように適応させました:
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class ParameterizedTypeEg<E> {
public Class<E> getTypeParameterClass() {
Type type = getClass().getGenericSuperclass();
ParameterizedType paramType = (ParameterizedType) type;
return (Class<E>) paramType.getActualTypeArguments()[0];
}
private static class StringHome extends ParameterizedTypeEg<String> {
private String _string;
StringHome (String string) {
_string = string;
}
}
public static void main(String[] args)
throws InstantiationException, IllegalAccessException {
String str = new StringHome("my string").getTypeParameterClass().newInstance();
String str2 = new ParameterizedTypeEg<String>().getTypeParameterClass().newInstance();
}
}
このアプローチは、str 変数に対してうまく機能します。次に、str2 は、私には同じタイプに見えるもので作成されます (ParameterizedTypeEg < String >、これは基本的に StringHome と同じものです)。ただし、このアプローチは str2 では機能せず、(ParameterizedType) 型をキャストしようとすると ClassCastException がスローされます。
str2 の場合、ParameterizedTypeEg を String でパラメーター化しましたが、getGenericSuperclass() は str とは非常に異なるものを返します。また、メソッド内で str2 は「this」を ParameterizedTypeEg として示しますが、str の場合、「this」は ParameterizedTypeEg$StringHome です。それが問題の根源だと思います。str2 のジェネリック型が決定されていることを Java が認識しないのはなぜですか?
パラメータ化された型が階層の複数のレベルを通過するときに、同じ問題のように見えるものがありますか? つまり、クラス B< T > には A< T > が含まれており、B をインスタンス化します。A 内では、上記のアプローチを使用して A のパラメーター化された型を決定することによって String オブジェクトを作成することはできません。このアプローチでは、包含階層の場合にも例外が発生します。そして、これは私に問題を引き起こします。これは、パラメーター化された型を複数のレベルの包含および/または継承を介して渡し、同じアプローチですべての場合にジェネリック型のインスタンスを生成できるようにしたいためです。
ありがとう、ジョン