将非元组传递给(Int,Int)=>()编译,为什么?

时间:2017-04-01 20:54:51

标签: scala

有人可以解释为什么下面的代码会编译吗?

我认为它不应该编译。

object RandomExperiments extends App{
  def takeTuple(t:(Int,Int))=print (s"$t ${t._1}\n")
  takeTuple(1,3) // this should not compile !!!
  takeTuple (1,3) // this should not compile !!!
  takeTuple((1,3))
  takeTuple(((1,3)))

  def takeTwoInts(i1:Int,i2:Int)=print (s"$i1 $i2\n")

  takeTwoInts(1,2)

  // takeTwoInts((1,2)) // does not compile , this is expected

}

(1,3) 1
(1,3) 1
(1,3) 1
(1,3) 1
1 2

1 个答案:

答案 0 :(得分:8)

它被称为自动翻译。编译器发现takeTuple没有可用于具有两个Int参数的重载,但是可以识别出参数是否可以转换为(Int, Int)并进行转换。如果您使用-Xlint:_进行编译,则会看到如下警告:

scala> takeTuple(1,3)
<console>:12: warning: Adapting argument list by creating a 2-tuple: this may not be what you want.
        signature: takeTuple(t: (Int, Int)): Unit
  given arguments: 1, 3
 after adaptation: takeTuple((1, 3): (Int, Int))
       takeTuple(1,3)
                ^

您可以使用-Yno-adapted-args标记(推荐)来禁用此功能