我通常这样调用构造函数:final Type typeOfMap = new TypeToken<Map<String, Object>>()。我从未见过它后面跟着其他代码,例如 {}.getType()。这是什么语法?
它是匿名内部类的语法。
{} 是一个对象吗?为什么可以在上面调用一个函数?
是的,你从中得到一个对象。这就是为什么可以在其上调用方法的原因。
当您需要一个类的特定行为一次时,匿名类很有用。就像下面的例子一样,如果你在普通的 A 对象上调用 sayHello,那么它将返回 Hello。但是,对于匿名类的对象,sayHello 方法的行为发生了变化,这次它返回 Bonjour。
public class SomeClass {
public static void main(String[] args) {
A defaultObj = new A();
A customObj = new A() {
@Override
public String sayHello() {
return "Bonjour";
}
};
System.out.println(defaultObj.sayHello());
System.out.println(customObj.sayHello());
}
}
class A {
String sayHello() {
return "Hello";
}
}
输出
Hello
Bonjour
TypeToken 的 Gson 文档也提到了匿名类的原因和用法。在 TypeToken 类中使用的原因是它用于在运行时检索令牌的类型。否则,由于类型擦除,泛型类型信息在运行时不可用。
https://www.javadoc.io/doc/com.google.code.gson/gson/2.6.2/com/google/gson/reflect/TypeToken.html
表示泛型类型 T。Java 还没有提供表示泛型类型的方法,所以这个类提供了。强制客户端创建此类的子类,即使在运行时也可以检索类型信息。例如,要为 List 创建类型文字,您可以创建一个空的匿名内部类:
TypeToken<List> list = new TypeToken<List>() {};