用于对象构造的异常语法



我是Java编程的新手。在阅读一个开源项目的代码时,我遇到了一行我无法理解的代码:

final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();

我的问题是:

  1. 我通常调用这样的构造函数:final Type typeOfMap = new TypeToken<Map<String, Object>>()。我从未见过它后面跟着{}.getType()之类的其他代码。这是什么语法
  2. {}是对象吗?为什么你可以调用上面的函数

p.S.Typejava.lang.reflect.TypeTypeTokencom.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<列表>(({};

最新更新