【问题标题】:Object callback defined in unusual way in JavaJava中以不寻常方式定义的对象回调
【发布时间】:2021-08-31 14:35:53
【问题描述】:

我遇到了一个代码,有一件事情难倒了我。这是代码

static public Return fun1()
{
  return new register(new SomeMap[]{
         null, 
         new SomeMap(new Basic(String.class), new Basic(String.class))
  })
  { 
    @Override
    public Return getSomething(int val)
    {
     ....
    }
  };
}

如您所见,覆盖回调方法定义在new register(..) 的范围之外。回调函数似乎是在它自己的代码块中定义的。这可能吗?这是如何工作的?

) 在函数覆盖之前。

不应该这样吗?

static public Return fun1()
    {
      return new register(new SomeMap[]{
             null, 
             new SomeMap(new Basic(String.class), new Basic(String.class))
      }
      
        @Override
        public Return getSomething(int val)
        {
         ....
        }
      );
    }




public static class register extends SomeMap
{
   public register(SomeMap[] somemaps)
   {
   }

    public Return getSomething(int val)
    {
     ....
    }
}

public static abstract class SomeMap
{
   // no constructors here just some method definitions here
}

【问题讨论】:

  • 你可以数一下大括号,看看它在匿名类定义中定义的。不过它看起来确实是由一只醉酒的猴子写的。
  • 当我签入我的 IDE 时,) 在函数覆盖之前关闭
  • 我说的不是),我说的是{) 用于构造函数。
  • 但是函数覆盖不应该发生在)之前吗?
  • registerReturn 的子类吗?

标签: java object callback anonymous-class


【解决方案1】:

虽然普通的简单匿名类看起来只是

new Anonymous() {
    public void method() {
        // implementation
    }
};

该示例采用 SomeMap[] 构造函数参数,但其他情况相同

new register(       // New anonymous class
    new SomeMap[]{  // Provide SomeMap[] for the constructor
         null,      // SomeMap[0] contains null
         new SomeMap(new Basic(String.class), new Basic(String.class)) // SomeMap[1] has data
    }) {            // End constructor 
        // Define the method, in the right place
        @Override
        public Return getSomething(int val) {
        }
    };  // End anonymous class

我不会让那种代码飞起来,即使它的格式正确。

【讨论】:

  • 我只是对这部分感到困惑,其中覆盖功能在) 之外。它不应该紧跟在初始化块之后吗?
  • 没有初始化块。方法定义必须在) 之外,否则它会在构造函数参数内。
  • 哦。我很困惑,因为这就是stackoverflow.com/questions/5310403/… 这里所描述的内容,而且getSomething() 必须是SomeMap 的一部分,对吗?
  • SomeMap(或者更确切地说是SomeMap[])是构造函数参数,所以不对。
  • 另外,我们不能在匿名类中调用构造函数,这就是我们使用初始化块的原因,对吧?
猜你喜欢
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多