次のコード:
public static void main(String args[]) throws NoSuchFieldException {
List<Integer> li = new ArrayList<Integer>();
ParameterizedType apType = (ParameterizedType) li.getClass().getGenericSuperclass();
Type[] typeArguments = apType.getActualTypeArguments();
int _i = 0;
for (Type type : typeArguments) {
System.out.format("parameterized type %d is: %s", ++_i, type);
}
}
生成:
parameterized type 1 is: E
- Eが型パラメーター名であることを考えると、これは Type Erasure の影響によるものであり、「不明」と解釈されるべきであるということを正しく理解していますか?
- 「E」という名前を特別に解釈しなければならないのは奇妙に思えます (さらに存在する場合は「S」、「U」などもあると思います)。クラス「E」の場合はどうなりますか? さらに、メソッド名は get_Actual_TypeArgumentsです。変数のように型パラメーターがプレースホルダーとして機能することを考えると、メソッドが変数の名前を返さなければならないのは非常に奇妙だと思います。ここで何か不足していますか?
また、スーパークラスをParameterizedTypeにキャストできるのに、クラス自体をキャストできない理由も明確ではありません。li.getClass()の結果をParameterizedTypeとしてキャストしようとすると、次のコンパイル時エラーが発生します。
必須: ParameterizedType が見つかりました: CAP#1 が新しい型変数であるクラス: CAP#1 は ? のキャプチャからリストを拡張します リストを拡張します
この関連するSOの投稿を見たことがありますが、それは私を啓発していません。