5
class Foo {
  public Foo(String s) {}
}
print new Foo()

このコードが機能するのはなぜですか?

プリミティブ型のパラメーターを使用してコンストラクターを宣言すると、スクリプトは失敗します。

4

1 に答える 1

4

Groovy は、要求されたことを実行するために最善を尽くします。を呼び出すと、値を取ることができるコンストラクターがあるためnew Foo()、呼び出しと呼び出しが一致します。new Foo( null )null

コンストラクターがプリミティブ型を取るようにすると、これは にならないnullため、ご覧のとおり、Groovy はCould not find matching constructor for: Foo()例外をスローします。

メソッドでも同じことを行うので、次のようになります。

class Test {
  String name
  
  Test( String s ) {
    this.name = s ?: 'tim'
  }
  
  void a( String prefix ) {
    prefix = prefix ?: 'Hello'
    println "$prefix $name"
  }
}

new Test().a()

出力Hello tim(コンストラクターとメソッドの両方が null パラメーターで呼び出されるため)

一方:

new Test( 'Max' ).a( 'Hola' )

版画Hola Max

明確化

Groovy User メーリング リスト で質問したところ、次のような回答がありました。

これは (コンストラクターだけでなく) 任意のメソッド呼び出しに有効であり、私 (および他の人) はこの「機能」が (非常にエラーが発生しやすいため) 本当に嫌いなので、Groovy 3 ではおそらく消えるでしょう。また、静的コンパイルではサポートされていません。 :)

それで、それは(今のところ)動作しますが、それに依存しないでください:-)

于 2012-11-28T10:47:43.307 に答える