为何这段Scala代码能通过类型检查?
为什么这段Scala代码能编译运行?
object Q{ trait C{ def f(x: Int) : Int } def applyTo3(c: C) = c.f(3) def main(args: Array[String]) = println(applyTo3(x => x+1)) }
这是Scala的单抽象方法(SAM)转换特性在起作用,具体逻辑如下:
- 你定义的
trait C仅包含一个抽象方法f(x: Int): Int,属于符合要求的SAM类型(即只有单个未实现抽象方法的特质/类)。 - 当你向
applyTo3传入x => x+1这个Int => Int类型的函数时,Scala编译器会自动生成一个实现了C的匿名类实例,把传入的函数逻辑作为f方法的实现,等价于手动编写以下代码:
applyTo3(new C { override def f(x: Int): Int = x + 1 })
- 这种语法糖让你可以用更简洁的函数式写法替代繁琐的匿名类实现,打通了Scala面向对象和函数式编程的衔接。
运行时,自动生成的实例调用f(3)会执行3+1,最终输出结果4。
内容的提问来源于stack exchange,提问作者Gavin Lowe
相关产品推荐
相关产品推荐

