Использование Closure в качестве аргумента конструктора суперкласса - PullRequest
3 голосов
/ 27 сентября 2010

Мне кажется, что я не могу использовать Closure в качестве параметра для конструктора суперкласса, когда он указан inline.

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..

Я понимаю, что это несколько странный сценарий использования, и я могу пока придумать что-то вроде этого. Но мне интересно, стоит ли ожидать этого? Или у меня неверный синтаксис?

Ответы [ 2 ]

1 голос
/ 27 сентября 2010

Я думаю, что проблема связана с тем, что 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(...) синтаксиса

0 голосов
/ 27 сентября 2010

Возможно, это путает замыкание и блок ... Можете ли вы попробовать

super( { -> println 'called' } )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...