我是Java编程的新手。在阅读一个开源项目的代码时,我遇到了一行我无法理解的代码:
final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();
我的问题是:
- 我通常调用这样的构造函数:
final Type typeOfMap = new TypeToken<Map<String, Object>>()
。我从未见过它后面跟着{}.getType()
之类的其他代码。这是什么语法 {}
是对象吗?为什么你可以调用上面的函数
p.S.Type
是java.lang.reflect.Type
,TypeToken
是com.google.gson.reflect.TypeToken
。
我也是Java新手,但据我所知,这是一个属于抽象泛型类new TypeToken<Map<String, Object>>() {}
的构造函数。类本身可能看起来像这样:public abstract class TypeToken<X>
。。。现在,对于方法.getType().
,我真的不确定它是如何编码的。你提醒我,这是我需要学习/理解的东西的遗愿清单,但我很确定这个代码模式有点过于设计,(这可能是我的偏见,正是因为我不知道它或它对什么有用(
.getType()
方法可以是抽象内部的公开的和非抽象的方法。
我个人发现,在某些情况下(只是在一些情况下(,实例化抽象对象比扩展抽象对象更方便(这是它们通常使用的方式(,特别是在您的抽象对象需要在特定生命周期创建另一个对象,或者抽象对象需要同一类内的互操作性的情况下。
现在,如果我没有错的话,我认为特定的实现com.google.gson.reflect.TypeToken
使用反射来获得未初始化对象的类类型,而不实际创建对象(也许它是在窗帘后面创建的(,如果你试图创建嵌套泛型类数组的newInstance,你知道它会变得很头疼,因为有一种叫做;擦除";。
我通常调用这样的构造函数:final Type typeOfMap=newTypeToken<映射<字符串,对象>gt;((。我从未见过其他代码段,如{}.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还没有提供表示泛型类型,所以这个类是这样做的。强制客户端创建该类的一个子类,用于检索类型信息即使在运行时也是如此。例如,为创建类型文字列表中,可以创建一个空的匿名内部类:
TypeToken<列表>list=新的TypeToken<列表>(({};