我遇到了一些我无法完全解释的Scala行为。
假设我们有一个重载的方法。
def foo = List('a','b','c') //NoArgFoo
def foo(x: Int*) = List('X','Y','Z') //VarArgsFoo
[注意:顺序无关紧要,但它们必须位于同一编译单元中。由于REPL中的两条单独的线将仅遮蔽另一条线。]
现在让我们尝试各种方法来调用方法。
foo //res0: List[Char] = List(a, b, c) <--NoArgFoo
foo() //res1: List[Char] = List(X, Y, Z) <--VarArgsFoo
foo(1) //res2: Char = b <--NoArgFoo.apply(1)
foo(1, 2) //res3: List[Char] = List(X, Y, Z) <--VarArgsFoo
现在让我们将foo
类型更改为String
,它也有一个apply()
方法。
foo //res0: String = ABC <--NoArgFoo
foo() //res1: String = xyz <--VarArgsFoo
foo(1) //res2: String = xyz <--VarArgsFoo
foo(1, 2) //res3: String = xyz <--VarArgsFoo
这似乎很奇怪,直到我想起apply()
不是java.lang.String
的本机。它可以通过隐式转换来使用,并且由于编译器在不需要时不会调用隐式,因此该结果有意义。但是现在我们的行为不一致了。
因此,apply()
优先于varargs是错误还是功能?这仅仅是编译器作者任意或反复无常的选择的结果吗?这是varargs机制不可避免的结果吗?