【问题标题】:Unusual syntax used for object construction用于对象构造的异常语法
【发布时间】:2020-09-04 02:16:44
【问题描述】:

我是 Java 编程新手。在阅读一个开源项目的代码时,我遇到了一行我看不懂的代码:

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

我的问题是:

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

附: Typejava.lang.reflect.TypeTypeTokencom.google.gson.reflect.TypeToken

【问题讨论】:

    标签: java reflection reflections


    【解决方案1】:

    我也是 Java 新手,但据我所知,这是一个属于抽象泛型类的构造函数 new TypeToken<Map<String, Object>>() {} 类 tiself 可能看起来像这样:public abstract class TypeToken<X> ... 现在,对于.getType(). 的方法,我不太确定它是如何编码的。 你提醒我这是我要学习/理解的东西的清单,但我很确定这个代码模式有点过度设计,(这可能是我的偏见,正是因为我不知道它或它是什么可能有用)

    .getType() 方法,可能是抽象内部的一个公开的非抽象的方法。

    我个人发现在某些情况下(只是在某些情况下),实例化抽象对象比扩展它们更方便(这是它们通常的使用方式),特别是在您的抽象对象需要创建另一个对象的情况下在特定的生命周期,或者当抽象对象需要在同一个类中进行互操作时。

    现在,如果我没记错的话,我认为特定实现 com.google.gson.reflect.TypeToken 使用反射来获取未初始化对象的类类型,而无需实际创建对象(也许它确实在幕后),如果您尝试创建嵌套泛型类数组的 newInstance,您就会知道它是如何令人头疼的,因为所谓的“擦除”。

    【讨论】:

      【解决方案2】:

      我通常这样调用构造函数:final Type typeOfMap = new 类型令牌>()。我从来没有见过它 其他代码片段,例如 {}.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 = new TypeToken() {};

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-05
        • 2018-09-14
        • 1970-01-01
        • 2013-11-07
        • 1970-01-01
        • 2017-06-17
        • 1970-01-01
        • 2017-06-17
        相关资源
        最近更新 更多