当内联指定时,我似乎无法将Closure用作超类构造函数的参数。
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()
编译失败,显示消息Constructor call must be the first statement in a constructor.
。
我意识到这是一个有点奇怪的用例,我可以暂时围绕它进行设计。但我很感兴趣,这是可以预料的吗?或者我的语法不正确?
答案 0 :(得分:1)
我认为这个问题与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()
它不是那么好但至少它可行..另一种方法是使用普通的new Closure(...)
语法来定义闭包
答案 1 :(得分:0)
它可能会让一个闭包和一个块感到困惑......你可以试试吗
super( { -> println 'called' } )