4
Type collectionType = new TypeToken<Collection<Integer>>(){}.getType();
で使用される理由は、それが新しい匿名型を作成していますGsonのドキュメントからlink to documentation
Type collectionType = new TypeToken<Collection<Integer>>(){}.getType();
で使用される理由は、それが新しい匿名型を作成していますGsonのドキュメントからlink to documentation
である。説明してくださいクラスが汎用でない場合(*)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>.