繁体   English   中英

理解Scala中的类型推理

[英]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
}

DEMO

并且真的很惊讶最终的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM