Scala中的println _:为什么type()=> Unit而不是(Any)=> Unit?

Han*_*Sun 2 scala function

例如,我想将函数分配println给变量k

scala> val k = println _
k: () => Unit = <function0>
Run Code Online (Sandbox Code Playgroud)

我希望k的类型是,(Any) => Unit但它的实际类型是() => Unit.当我k使用argumnent 调用时,它有一个错误:

scala> k(3)
<console>:9: error: too many arguments for method apply: ()Unit in trait Function0
              k(3)
               ^
Run Code Online (Sandbox Code Playgroud)

但是,printlin使用该参数调用效果很好:

scala> println(3)
3
Run Code Online (Sandbox Code Playgroud)

有没有人有关于将函数对象分配给println变量的想法?

kir*_*uku 9

println _类型的原因() => Unit是因为存在重载定义println,不带任何参数():

def println() = Console.println()
Run Code Online (Sandbox Code Playgroud)

为了使用println带有参数的,你必须明确告诉编译器选择它:

scala> val k = println(_: Any)
k: Any => Unit = <function1>

scala> k(3)
3
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是使用类型归属:

scala> val k: Any => Unit = println
k: Any => Unit = <function1>

scala> k(3)
3
Run Code Online (Sandbox Code Playgroud)