例如,我想将函数分配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变量的想法?
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)