当我使用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
?
答案 0 :(得分:18)
这就是超级型令牌的目的。
答案 1 :(得分:7)
new TypeToken<Collection<Integer>>(){}
表示您正在创建扩展TypeToken<Collection<Integer>>
的{{3}}。同时,您正在创建该匿名类的实例。
从链接:
匿名类使您可以使代码更简洁。它们使您能够同时声明和实例化一个类。他们就像当地的班级,除了他们没有名字。如果您只需要使用本地类一次,请使用它们。
答案 2 :(得分:3)
TypeToken是抽象的,所以你必须创建一个具体的类来实例化它,这就是你拥有{}
的原因。
此代码创建具体的匿名子类,实例化它然后在实例上调用getType
。