16

当我使用 Gson 在 object 和 json 之间进行解析时,TypeToken 的初始化非常奇怪:

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

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

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

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

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

为什么不直接使用public呢?

4

3 回答 3

19

“奇怪”并不完全是一个技术术语。该类的定义方式迫使您显式指定要与它的具体实例关联的泛型参数。因为已编译的 Java 类保留了有关其泛型参数的信息,所以这些信息随后可供需要它的框架库使用。

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

于 2013-03-18T14:55:28.767 回答
7

new TypeToken<Collection<Integer>>(){}意味着您正在创建一个扩展的匿名内部类TypeToken<Collection<Integer>>。同时,您正在创建该匿名类的实例。

从链接:

匿名类使您能够使您的代码更简洁。它们使您能够同时声明和实例化一个类。它们类似于本地类,只是它们没有名称。如果您只需要使用一次本地类,请使用它们。

于 2013-03-18T14:53:17.887 回答
3

TypeToken是抽象的,所以你必须创建一个具体的类来实例化它,这就是为什么你有{}.

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

于 2013-03-18T14:51:08.630 回答