为什么可以在没有任何参数的情况下调用具有单个参数的构造函数?

时间:2012-11-28 08:51:43

标签: groovy

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

为什么这段代码有效?

如果我使用基本类型参​​数声明构造函数,则脚本失败。

1 个答案:

答案 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中消失。此外,它不受支持通过静态编译:)

所以,它(现在)有效,但不依赖它: - )