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

2022-09-03 00:41:24

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

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

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

附言我已经研究了类的源代码,它是一个(不是接口或抽象),没有任何构造函数,这意味着它用作默认值。TypeTokenclassno-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


答案 1

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

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


答案 2

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

从链接:

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