我是java编程新手。在阅读一个开源项目的代码时,我遇到了一行我无法理解的代码: final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();
我的问题是:
我通常这样调用构造函数: final Type typeOfMap = new TypeToken<Map<String, Object>>()
. 我从未见过它后面跟着其他代码,比如 {}.getType()
. 这是什么语法?
是 {}
一个物体?为什么你能调用它的函数?
附笔 Type
是 java.lang.reflect.Type
,和 TypeToken
是 com.google.gson.reflect.TypeToken
.
2条答案
按热度按时间x9ybnkn61#
我对java也是新手,但据我所知,这是一个属于抽象泛型类的构造函数
new TypeToken<Map<String, Object>>() {}
类本身可能如下所示:public abstract class TypeToken<X>
... 现在,对于方法.getType().
我不太清楚那是怎么编码的。你提醒我,这是在我的桶清单的东西学习/理解,但我很肯定,这个代码模式是有点太过工程,(ofc这可能是我的偏见,正是因为我不知道它或它可能是有用的)这个
.getType()
方法,可以是摘要中的一个方法,它是公共的和非抽象的。我个人发现,在某些情况下(仅在某些情况下),示例化抽象对象比扩展抽象对象(通常是这样使用的)更方便,特别是在抽象对象需要在特定生命周期中创建另一个对象的情况下,或者当抽象对象需要在同一类中进行互操作时。
如果我没弄错的话,我认为
com.google.gson.reflect.TypeToken
使用reflect来获取未初始化对象的类类型,而不实际创建对象(可能是在幕后创建的),如果您尝试为嵌套泛型类数组创建一个新示例,您就知道它会成为一个令人头痛的问题,因为有一种称为“擦除”的方法。31moq8wy2#
我通常这样调用构造函数:final type typeofmap=newtypetoken<map<string,object>>()。我从未见过它后面跟着{}.gettype()等其他代码。这是什么语法?
它是匿名内部类的语法。
{}是对象吗?为什么你能调用它的函数?
是的,你从中得到一个物体。这就是为什么可以对其调用方法。
当您只需要一次类的特定行为时,匿名类非常有用。像下面的例子一样,如果你在一个普通的对象上调用sayhello,那么它将返回hello。但是,对于匿名类的对象,sayhello方法的行为发生了变化,这次它返回了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还没有提供表示泛型类型的方法,所以这个类提供了。强制客户机创建此类的子类,这样即使在运行时也可以检索类型信息。例如,要为列表创建类型文字,可以创建空的匿名内部类:
typetokenlist=新建typetoken(){};