[英]Understanding type inferrence in Scala
我写了以下简单的程序:
import java.util.{Set => JavaSet}
import java.util.Collections._
object Main extends App {
def test(set: JavaSet[String]) = ()
test(emptySet()) //fine
test(emptySet) //error
}
并且真的很惊讶最终的test(emptySet)
没有被编译。 为什么? test(emptySet())
什么区别? 我认为在Scala中我们可以在这种情况下自由省略括号。
请参阅Scala规范中的方法转换 :
以下四个隐式转换可以应用于未应用于某些参数列表的方法。
评估
类型=> T的无参数方法m总是通过计算m绑定的表达式转换为类型T.
隐式应用
如果该方法仅采用隐式参数,则在此处遵循规则传递隐式参数。
Eta扩张
否则,如果该方法不是构造函数,并且期望类型pt是函数类型(Ts')⇒T',则对表达式e执行eta扩展。
空应用程序
否则,如果e具有方法类型()T,则将其隐式应用于空参数列表,从而产生e()。
你想要的是“空应用程序”,但它只适用于以前没有转换的情况,并且在这种情况下会发生“Eta Expansion”。
编辑:这是错误的,@ Jasper-M的评论是正确的。 没有进行eta扩展,“空应用程序”目前不适用于通用方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.