Scala 3中类A因a重复定义报错,Scala 2却允许,是设计如此吗?
Scala 2与Scala 3类成员命名冲突问题解答
这是Scala 3的设计使然,并非bug。
背后的原因:
- 在Scala 2中,类构造器里的参数
a: Int因为被this.a引用,会被编译器自动生成一个private[this] val a。此时允许同名方法def a()存在,因为Scala 2的命名解析会区分定义时带括号和不带括号的符号——哪怕调用时括号可以省略,定义层面仍被视为不同的符号。 - Scala 3重构了命名规则,统一了命名空间,不再区分定义时带不带括号的同名符号。构造器生成的
private[this] val a和方法def a()属于完全同名的符号,违反了单一命名空间的约束,因此编译器抛出重复定义的错误。
Scala 3的这个设计是为了简化语言的命名解析逻辑,消除潜在的符号歧义,让语言规则更一致。
修复方案示例:
可以通过修改构造器参数名或方法名来解决冲突:
// 方案1:修改构造器参数名 class A private(underlyingA: Int) { def a(): Int = underlyingA + 1 } // 方案2:修改方法名 class A private(a: Int) { def getA(): Int = a + 1 }
内容的提问来源于stack exchange,提问作者david.perez
相关产品推荐
相关产品推荐

