我写了以下简单的程序:
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中我们可以在这种情况下自由省略括号。
答案 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扩展,“空应用程序”目前不适用于通用方法。