java—用于对象构造的不寻常语法

0dxa2lsx  于 2021-07-05  发布在  Java
关注(0)|答案(2)|浏览(279)

我是java编程新手。在阅读一个开源项目的代码时,我遇到了一行我无法理解的代码: final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType(); 我的问题是:
我通常这样调用构造函数: final Type typeOfMap = new TypeToken<Map<String, Object>>() . 我从未见过它后面跟着其他代码,比如 {}.getType() . 这是什么语法?
{} 一个物体?为什么你能调用它的函数?
附笔 Typejava.lang.reflect.Type ,和 TypeTokencom.google.gson.reflect.TypeToken .

x9ybnkn6

x9ybnkn61#

我对java也是新手,但据我所知,这是一个属于抽象泛型类的构造函数 new TypeToken<Map<String, Object>>() {} 类本身可能如下所示: public abstract class TypeToken<X> ... 现在,对于方法 .getType(). 我不太清楚那是怎么编码的。你提醒我,这是在我的桶清单的东西学习/理解,但我很肯定,这个代码模式是有点太过工程,(ofc这可能是我的偏见,正是因为我不知道它或它可能是有用的)
这个 .getType() 方法,可以是摘要中的一个方法,它是公共的和非抽象的。
我个人发现,在某些情况下(仅在某些情况下),示例化抽象对象比扩展抽象对象(通常是这样使用的)更方便,特别是在抽象对象需要在特定生命周期中创建另一个对象的情况下,或者当抽象对象需要在同一类中进行互操作时。
如果我没弄错的话,我认为 com.google.gson.reflect.TypeToken 使用reflect来获取未初始化对象的类类型,而不实际创建对象(可能是在幕后创建的),如果您尝试为嵌套泛型类数组创建一个新示例,您就知道它会成为一个令人头痛的问题,因为有一种称为“擦除”的方法。

31moq8wy

31moq8wy2#

我通常这样调用构造函数:final type typeofmap=newtypetoken<map<string,object>>()。我从未见过它后面跟着{}.gettype()等其他代码。这是什么语法?
它是匿名内部类的语法。
{}是对象吗?为什么你能调用它的函数?
是的,你从中得到一个物体。这就是为什么可以对其调用方法。
当您只需要一次类的特定行为时,匿名类非常有用。像下面的例子一样,如果你在一个普通的对象上调用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还没有提供表示泛型类型的方法,所以这个类提供了。强制客户机创建此类的子类,这样即使在运行时也可以检索类型信息。例如,要为列表创建类型文字,可以创建空的匿名内部类:
typetokenlist=新建typetoken(){};

相关问题