You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何这段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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:45:44