为什么Gson中的TypeToken结构如此奇怪?

时间:2013-03-18 14:49:40

标签: java json constructor gson

当我使用Gson在object和json之间解析时,TypeToken的初始化是如此奇怪:

Type collectionType = new TypeToken<Collection<Integer>>(){}.getType();

我只知道这种格式:new TypeToken<Collection<Integer>>().getType();,上面的括号是什么?提前谢谢!

PS 我查看了TypeToken类的源代码,它是class(不是接口或抽象),没有任何构造函数,这意味着它使用no-parameter constructor为默认值。

P.S.2 当我删除大括号时,它告诉我构造函数不可见。当我查看TypeToken类时,这是构造函数:

  protected TypeToken() {
        this.type = getSuperclassTypeParameter(getClass());
        this.rawType = (Class<? super T>) $Gson$Types.getRawType(type);
        this.hashCode = type.hashCode();
  }

为什么不只使用public

3 个答案:

答案 0 :(得分:18)

“怪异”并不是一个技术术语。该类的定义方式是强制您显式指定与其具体实例关联的泛型参数。因为已编译的Java类保留有关其通用参数的信息,因此信息可供需要它的框架库使用。

这就是超级型令牌的目的。

答案 1 :(得分:7)

new TypeToken<Collection<Integer>>(){}表示您正在创建扩展TypeToken<Collection<Integer>>的{​​{3}}。同时,您正在创建该匿名类的实例。

从链接:

  

匿名类使您可以使代码更简洁。它们使您能够同时声明和实例化一个类。他们就像当地的班级,除了他们没有名字。如果您只需要使用本地类一次,请使用它们。

答案 2 :(得分:3)

TypeToken是抽象的,所以你必须创建一个具体的类来实例化它,这就是你拥有{}的原因。

此代码创建具体的匿名子类,实例化它然后在实例上调用getType