那是因为printString(_:Int)
它实际上所做的是在一个函数中转换该表达式,该函数接受一个 Int 并且可能永远不会被调用......请参阅:
scala> implicit def int2string(i: Int): String = "foo"
int2string: (i: Int)String
scala> def printString(i: String) = print(i)
printString: (i: String)Unit
这里没有语法错误意味着它正在工作。举例说明:
scala> printString(_:Int) // Function from Int to Unit
res0: Int => Unit = <function1>
编译器将外部表达式转换为{ x:Int => printString(x) }
,然后应用隐式转换,因为隐式在范围内,所以结果是{ x:Int => printString(int2string(x)) }
。
一个不起作用的,因为没有从 Object 到 String 的转换:
scala> printString(_:Object)
<console>:10: error: type mismatch;
found : java.lang.Object
required: String
printString(_:Object)
现在要实际查看打印,我们需要调用它:
scala> val foo = printString(_:Int)
foo: Int => Unit = <function1>
scala> foo(5)
foo