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

为什么这段代码有效?

如果我使用原始类型的参数声明构造函数,则脚本将失败。

4

1 回答 1

4

Groovy 将尽最大努力去做您要求它做的事情。当您调用时new Foo(),它会与调用匹配,new Foo( null )因为有一个可以获取null值的构造函数。

如果您让构造函数采用原始类型,那么 this 不能是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(因为构造函数和方法都使用空参数调用)

其中:

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

印刷Hola Max

澄清

在 Groovy User mailing list 上询问,得到以下回复:

这对任何方法调用(不仅是构造函数)都是有效的,而且我(以及其他人)真的不喜欢这个“特性”(因为它很容易出错)所以它可能会在 Groovy 3 中消失。另外,它不受静态编译的支持:)

所以在那里,它可以工作(现在),但不要依赖它:-)

于 2012-11-28T10:47:43.307 回答