理解Scala中的类型推理

时间:2016-12-20 07:54:49

标签: scala methods

我写了以下简单的程序:

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中我们可以在这种情况下自由省略括号。

1 个答案:

答案 0 :(得分:4)

请参阅Scala规范中的Method Conversions

  

以下四个隐式转换可以应用于未应用于某些参数列表的方法。

     

评价

     

无参数方法m   of type =>通过计算m绑定的表达式,T总是转换为T类型。

     

隐式申请

     

如果该方法仅采用隐式参数,则遵循此处的规则传递隐式参数。

     

Eta Expansion

     

否则,如果方法不是构造函数,则预期类型为pt   是函数类型(Ts')⇒T',对表达式e执行eta扩展。

     

清空申请

     

否则,如果e   有方法type()T,它隐式应用于空参数列表,产生e()。

你想要的是“空应用程序”,但只有在没有早期转换的情况下才会应用它,并且在这种情况下会发生“Eta Expansion”。

编辑:这是错误的,@ Jasper-M的评论是正确的。没有进行eta扩展,“空应用程序”目前不适用于通用方法。