Scala 调用方法时依赖类型的隐式强制转换

Scala 调用方法时依赖类型的隐式强制转换,scala,Scala,scala编译器在这里做什么 def f[A](x: A): A = { x } f(1,2,3) res0:(Int,Int,Int)=(1,2,3) 我不是要求x是一个可变参数。但是,编译器似乎正在将参数列表强制转换为产品类型 如果我指定类型,例如 def f(x: Int): Int = { x } 然后试着打电话 f(1,2,3) 编译器认为方法f的参数(3)太多 那么它不应该说期望Int和found(Int,Int,Int) 这是为什么?编译器推断类型A为Tuple3[

scala编译器在这里做什么

def f[A](x: A): A = {
  x
}

f(1,2,3)
res0:(Int,Int,Int)=(1,2,3)

我不是要求
x
是一个可变参数。但是,编译器似乎正在将参数列表强制转换为产品类型

如果我指定类型,例如

def f(x: Int): Int = {
  x
}
然后试着打电话

f(1,2,3)
编译器认为方法f的
参数(3)太多

那么它不应该说
期望Int和found(Int,Int,Int)


这是为什么?

编译器推断类型
A
Tuple3[Int,Int,Int]
A.k.A.
(Int,Int,Int)
。它提供了语法功能,可以将
f(1,2,3)
转换为
f((1,2,3))

在第二种情况下,它不这样做,因此转换取决于函数类型。@raul:是的,Scala编译器在函数/方法应用、重载、,类型推断等。这是Scala中比较混乱的领域之一。在未来,事情将变得更加复杂。