理解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
}
DEMO
最后一行test(emptySet)
未被编译真的很惊讶。 为什么? test(emptySet())
什么区别? 我想在斯卡拉我们可以在这种情况下自由省略括号。
请参阅Scala规范中的方法转换:
以下四种隐式转换可应用于未应用于某些参数列表的方法。
评估
通过评估m所绑定的表达式,类型=> T的无参数方法m总是转换为类型T.
隐式应用
如果该方法只接受隐式参数,则在这里遵循规则传递隐式参数。
Eta扩展
否则,如果该方法不是构造函数,并且期望类型pt是函数类型(Ts')⇒T',则对表达式e执行eta-expansion。
空应用程序
否则,如果e具有方法type()T,则它隐式应用于空参数列表,产生e()。
您需要的是“空应用程序”,但仅适用于以前没有任何转换,并且在此情况下会发生“Eta扩展”。
编辑:这是错误的和@ Jasper-M的评论是正确的。 没有eta扩展正在发生,“Empty Application”仅适用于当前的通用方法。
链接地址: http://www.djcxy.com/p/94485.html上一篇: Understanding type inferrence in Scala
下一篇: Correct implementation of SearchView in android toolbar