apply()优先于varargs调用

时间:2020-04-03 17:37:55

标签: scala variadic-functions

我遇到了一些我无法完全解释的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机制不可避免的结果吗?

0 个答案:

没有答案
相关问题