Scala的方法重载:与使用或不使用括号定义的varargs和no-args方法的微妙功能差异背后的原因?

Eem*_*ola 1 scala overloading parentheses

Scala(2.8.1)在处理重载方法时遇到了一个奇怪的问题,其中第一个是无参数,第二个采用可变数量的参数(0..N).测试代码:

class Test {
  def method1 = println("method1 invoked with zero args")
  def method1(args: Any*) = println("method1 with args " + args)

  def method2() = println("method2 invoked with zero args")
  def method2(args: Any*) = println("method2 with args " + args)
}

object Test {
  def main(args: Array[String]) {
    val t = new Test
    t.method1
    t.method1()
    t.method1(1,2,3)
    println
    t.method2
    t.method2()
    t.method2(1,2,3)
  }
}
Run Code Online (Sandbox Code Playgroud)

通过编译和运行它,输出是:

method1 invoked with zero args
method1 with args WrappedArray()
method1 with args WrappedArray(1, 2, 3)

method2 invoked with zero args
method2 invoked with zero args
method2 with args WrappedArray(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

因此,如果method1使用括号和零参数运行,我们将使用varargs方法,但在method2这种情况下,将调用no-args方法.

这种奇怪行为背后的解释或推理是什么?

Ale*_*nov 8

那么,问题可以重新表述为"为什么有人认为这种行为是合乎逻辑的?" :)

没有括号定义的方法不能用括号调用,因此method1只有一个选项.

method2情况下,通话t.method2()有两个重载选项可供选择,而且def method2()是一个更适合.

有关如何选择最佳过载的精确描述,请参见Scala语言规范的第6.26.3节:规则非常简单和合理.