class Foo {
public Foo(String s) {}
}
print new Foo()
このコードが機能するのはなぜですか?
プリミティブ型のパラメーターを使用してコンストラクターを宣言すると、スクリプトは失敗します。
class Foo {
public Foo(String s) {}
}
print new Foo()
このコードが機能するのはなぜですか?
プリミティブ型のパラメーターを使用してコンストラクターを宣言すると、スクリプトは失敗します。
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 ではおそらく消えるでしょう。また、静的コンパイルではサポートされていません。 :)
それで、それは(今のところ)動作しますが、それに依存しないでください:-)