class Foo {
public Foo(String s) {}
}
print new Foo()
为什么这段代码有效?
如果我使用基本类型参数声明构造函数,则脚本失败。
答案 0 :(得分: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参数调用)
wheras:
new Test( 'Max' ).a( 'Hola' )
打印Hola Max
我asked on the Groovy User mailing list,得到以下回复:
这对任何方法调用(不仅是构造函数)都有效,而我(以及其他人)真的不喜欢这个“特性”(因为它非常容易出错)所以它可能会在Groovy 3中消失。此外,它不受支持通过静态编译:)
所以,它(现在)有效,但不依赖它: - )