Scala 3语法疑问:无类型new关键字用法解析
Scala 3无类型
new关键字语法解析 你的代码回顾
你给出的IO类flatMap实现:
def flatMap[B](f: A => IO[B]): IO[B] = new: def unsafeRun = f(self.unsafeRun).unsafeRun
语法原理
这个无类型的new是Scala 3新增的匿名类简化语法,专用于单抽象方法(SAM)类型或结构类型的场景:
- 首先你的
IO[B]肯定是一个仅包含unsafeRun这一个抽象方法的类型——要么是定义了该方法的trait,要么是对应的结构类型(比如type IO[B] = { def unsafeRun: B })。 - Scala 3允许在实例化这类类型时,省略重复的类型名,直接用
new:后跟抽象方法的实现。编译器会根据返回值类型IO[B]自动推断出要实例化的目标类型,生成对应的匿名类。
它完全等价于更 verbose 的写法:
def flatMap[B](f: A => IO[B]): IO[B] = new IO[B]: def unsafeRun = f(self.unsafeRun).unsafeRun
核心用途
- 精简代码:当目标类型通过上下文已经明确时,省去重复的类型声明,让代码更聚焦于核心逻辑(这里就是
unsafeRun的执行逻辑)。对于IO这种纯抽象的控制结构类型,这种写法能减少冗余,提升可读性。 - 适配结构类型:如果
IO是一个结构类型(而非显式的trait),这种无类型new依然能正常工作——编译器会根据结构要求生成符合该结构的匿名实例,无需提前定义显式的类或特质。
注意事项
- 这个语法只适用于仅有一个抽象成员的类型,如果目标类型有多个未实现的抽象方法,编译器会直接报错。
- 上下文必须足够明确:返回值类型必须能让编译器确定目标类型,否则还是需要显式写出
new IO[B]:这种完整形式。
内容的提问来源于stack exchange,提问作者MaatDeamon
相关产品推荐
相关产品推荐

