理解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