Groovy 使用闭包作为超类构造函数的参数

Groovy 使用闭包作为超类构造函数的参数,groovy,Groovy,在内联指定时,我似乎无法将闭包用作超类构造函数的参数 class Base { def c Base(c) { this.c = c } void callMyClosure() { c() } } class Upper extends Base { Upper() { super( { println 'called' } ) } } u = new Upper() u.callMyClosure() 编译失败,消息为构造函数调

在内联指定时,我似乎无法将闭包用作超类构造函数的参数

class Base {

  def c

  Base(c) {
    this.c = c
  }

  void callMyClosure() {
    c()
  }
}

class Upper extends Base {
  Upper() {
    super( { println 'called' } )
  }
}

u = new Upper()
u.callMyClosure()
编译失败,消息为
构造函数调用必须是构造函数中的第一条语句。


我意识到这是一个有点奇怪的用例,目前我可以围绕它进行设计。但我很感兴趣,这是预期的吗?还是我的语法不正确?

可能会混淆闭包和块…你能试试吗

super( { -> println 'called' } )

我认为这个问题与Groovy在试图将构造函数编译为Java类时将其转换为不同的内容有关。在调用
super
生成该错误之前,可能会展开闭包定义

解决方法是在构造函数本身之外定义闭包:

class Base {
  def c

  Base(c) {this.c = c}


  void callMyClosure() {
    c()
  }
}

class Upper extends Base {
  static cc = {println 'called'}

  Upper() {
    super(cc)
  }
}

u = new Upper()
u.callMyClosure()

虽然不太好,但至少能用。。另一种方法是使用普通的
新闭包(…)
语法来定义闭包,恐怕会得到相同的结果。好主意!这正是我所期待的,但就是找不到任何文档。我还发现了使用在那里初始化的映射的相同行为。出于兴趣,新的闭包语法是什么?闭包类本身是抽象的。我做了一些尝试来找出这种奇怪的语法(在将闭包用于构造函数之前实例化它)。。从我的理解来看,它似乎是抽象的,因为您通常对它进行子类化,并实现
doCall
方法,这是closureYeah的有效主体-阅读它肯定很有趣。谢谢你的意见!