为什么在此语句中使用{}进行实例化,类型collectionType = new TypeToken <collection <integer>&gt;(){}。getType();

时间:2017-12-07 09:30:14

标签: java initialization json-deserialization

请解释

中使用{}的原因
Type collectionType = new TypeToken<Collection<Integer>>(){}.getType();

这是来自Gson文档link to documentation

1 个答案:

答案 0 :(得分:3)

它正在创建一个新的匿名类型。这是类型擦除的解决方法,因为如果类不是通用的(*),则可以通过Class.getGenericSuperclass()Collection<Integer>反射性地获取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的“整数” - 失去了;但它仍然出现在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>.