Scala 3 中的双重定义

问题描述 投票:0回答:1

为什么这个类在 Scala 2.x 中被允许,而在 Scala 3 中却抱怨

a
的重复定义?

class A private(a:Int) {
   def a(): Int = this.a+1
}
       Double definition:
         private[this] val a: Int in class A at line 1 and
         def a(): Int in class A at line 2

这是设计使然还是 Scala 3 中的一个错误?

scala migration scala-3
1个回答
0
投票
class A private(a: Int) {
  def a(): Int = this.a + 1
}

TL;DR:在 Scala 2 中,这会创建

A
的成员和方法,它们都称为
a
,但 Scala 3 不允许重复使用相同的名称。

在 Scala 2 中,有一个成员

a
,其中包含传递给构造函数的值,以及一个返回
a
的方法
this.a + 1
。这可以通过添加第二种方法来显示
b
:

class A(a: Int) {
  def a(): Int = a + 1

  def b(): Int = a() + 1
}

println(new A(3).a()) // 4
println(new A(3).a)   // 4 with compiler warning about auto-application
println(new A(3).b()) // 5

在类中,您会获得不同的

a
值,具体取决于它是裸露使用还是作为函数调用。方法
a
使用成员值
a
,而方法
b
使用方法值
a
。在类之外只有方法是可见的。

请注意,这具体是

val
的非
var
class
构造函数参数的行为问题。如果构造函数参数设置为
val
var
,即使在 Scala 2 中,编译器也会将其标记为重复。

© www.soinside.com 2019 - 2024. All rights reserved.