5

コンストラクターを持つ抽象 Java クラスがあり、グルーヴィーなクラスから拡張しています。(アイデアは、Java クラスをアプリ内のコントラクトとして保持し、特定のコンストラクターとメソッドを実装する外部の groovy クラスをロードすることです)

Groovy で抽象スーパークラスのコンストラクターを強制的に実装するにはどうすればよいですか? Groovy では、抽象親クラスのコンストラクターの実装を強制できますか?

問題は、Eclipse Groovy IDE が親クラスのコンストラクターをサブクラスに実装することを強制していないことです。Groovy はそれを自動的に作成するので、それが強制しない理由でした。ただし、実行時に Java リフレクションを使用してコンストラクターを取得しようとすると失敗し、サブクラスで親コンストラクターを定義しないと失敗します。

(Groovy の経験はありません)

4

1 に答える 1

5

コンパイラでチェックされていない状況のようです。逆コンパイル時に、拡張クラスは空のコンストラクターを取得します。この状況は実行時に機能しないため、テストでカバーする必要があります。

このクラスを使用する方法がわかりません。私が知っている方法を試しました:

abstract class AbstractClass {
  String string
  Integer integer
  AbstractClass(String string, Integer integer) {
    this.string = string
    this.integer = integer
  }
}

class ImplClass extends AbstractClass { }

// every constructor fails
abs1 = new ImplClass('a', 1)

abs2 = [string: 'b', integer: 2] as ImplClass

abs3 = new ImplClass(abs: 'c', a: 3)

abs4 = ImplClass [string:'d', integer:4]

どちらも実行時に機能しませんでしたが、正常にコンパイルされました;-)。状況は、コンパイル エラーと実行時エラーに関するものです。多分JIRAを埋めますか?

逆に、コンストラクターを継承する必要がある場合@groovy.transfom.InheritConstructorsは、拡張クラスを使用できます。このようにして、super()明示的に呼び出す必要なくコンストラクターを取得できます。

于 2012-09-08T16:00:41.737 に答える