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

Scala 3实例化Trait时新增方法无法识别,对应文档变更点在哪?

问题

以下代码在Scala 2中可正常编译运行:

trait SomeTrait {
  val myName: String
}

class SomeClass() extends SomeTrait {
  override val myName: String = "Billy Banana"
}

val someClass = new SomeClass()
println(someClass.myName)

val extendedTrait = new SomeTrait {
  override val myName: String = "Amy Apples"
  def printName(): Unit = println(myName)
}

extendedTrait.printName()

但在Scala 3中,extendedTrait.printName()这一行会出现编译错误。请问Scala 3官方文档中哪部分内容提及了这一变更?

答案

这个变更属于Scala 3中特质初始化规则的调整,在Scala 3官方参考文档的「Trait Initialization」(特质初始化)章节有明确提及,核心是关于早期初始化机制的移除与初始化顺序的严格化。

Scala 2中允许匿名类里的val绕过线性初始化顺序提前完成初始化;但Scala 3严格遵循了线性初始化规则,匿名类中重写的val会按照继承层次的顺序初始化,导致调用printName()时myName还未完成初始化,触发编译错误。文档中同时说明了这类旧写法的替代方案:比如将val改为lazy val,或者使用构造参数传递初始化值来确保变量在使用前完成初始化。

内容的提问来源于stack exchange,提问作者Joe PP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 15:52:41