2017-12-07 21 views

答えて

3

である。説明してくださいクラスが汎用でない場合(*)Class.getGenericSuperclass()Class.getGenericInterfaces()を経由してを反射的に得ることができるため、これは型消去の回避策です。

このコードは、基本的に同じ機能を実装しIdeone demo

abstract class TypeToken<T> { 
    Type getType() { 
    ParameterizedType t = (ParameterizedType) getClass().getGenericSuperclass(); 
    return t.getActualTypeArguments()[0]; 
    } 
} 

public static void main (String[] args) { 
    Collection<Integer> list = new ArrayList<>(); 
    System.out.println(list.getClass().getGenericInterfaces()[0]); 

    TypeToken<Collection<Integer>> tt = new TypeToken<Collection<Integer>>() {}; 

    System.out.println(tt.getClass().getGenericSuperclass()); 
    System.out.println(tt.getType()); 
} 

出力:

java.util.List<E> 
Ideone.Ideone$TypeToken<java.util.Collection<java.lang.Integer>> 
java.util.Collection<java.lang.Integer> 
あなたが Collectionの "整数" -nessが失われていることがわかります

TypeTokenにはまだ存在していますので、getType()メソッドで取得できます。


(*)ここで重要なポイントは、あなたが(正確に)一般的な方法でTypeTokenを作成することができないということです。たとえば、

<T> TypeToken<T> getGenericToken() { 
    return new TypeToken<T>() {}; 
} 

は、期待通りに機能しません。Ideone demo

TypeToken<Collection<String>> t = getGenericToken(); 
System.out.println(t.getType()); // T, not Collection<String>.