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

Groovy 为什么可以在没有任何参数的情况下调用具有单个参数的构造函数?,groovy,Groovy,为什么这个代码可以工作 如果我用primitive类型的参数声明构造函数,脚本将失败。Groovy将尽全力完成您要求它做的事情。调用new Foo()时,它会匹配调用new Foo(null),因为有一个构造函数可以接受null值 如果将构造函数设置为基元类型,那么这不能是null,因此Groovy会抛出无法为:Foo()异常找到匹配的构造函数 方法也是如此,因此: class Foo { public Foo(String s) {} } print new Foo() 打印Hello

为什么这个代码可以工作


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

Groovy将尽全力完成您要求它做的事情。调用
new Foo()
时,它会匹配调用
new Foo(null)
,因为有一个构造函数可以接受
null

如果将构造函数设置为基元类型,那么这不能是
null
,因此Groovy会抛出
无法为:Foo()
异常找到匹配的构造函数

方法也是如此,因此:

class Foo {
  public Foo(String s) {}
}
print new Foo()
打印
Hello tim
(因为构造函数和方法都使用空参数调用)

惠拉斯:

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

new Test().a()
打印
Hola Max

澄清 我,并得到以下回应:

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


因此,它可以工作(目前),但不要依赖它:-)

应该注意的是,我在任何地方都找不到这一文档,因此在任何代码中使用它都会非常犹豫(因为我猜没有文档的东西在Groovy的更高版本中更可能消失)添加了一点我的答案,正如我从groovy核心开发人员那里得到的澄清:-)
new Test( 'Max' ).a( 'Hola' )