Scala 3 -使用带默认值的主构造函数和一个辅助构造函数创建不带“new”的对象

yhived7q  于 5个月前  发布在  Scala
关注(0)|答案(1)|浏览(82)

Scala 3.3.1
我有这个代码:

class Person(
    val firstName: String,
    val lastName: String,
    val birthYear: Int = -1,
    val address: String = ""
) {}

@main
def main() = {
  val p1 = Person("John", "Doe")
  val p2 = Person("Jane", "Doe", 1900)
  val p3 = Person("Josh", "Doe", 1912, "Main Street")
}

字符串
这是正确的,我可以创建没有new的对象,使用默认值。
现在,如果我引入一个二级构造函数,它会中断:

class Person(
    val firstName: String,
    val lastName: String,
    val birthYear: Int = -1,
    val address: String = ""
):
  def this() = this("John", "Doe")


它检测到main的前两行错误:None of the overloaded alternatives of method apply in object Person with types (): Person (firstName: String, lastName: String, birthYear: Int, address: String): Person match arguments (("John" : String), ("Doe" : String))None of the overloaded alternatives of method apply in object Person with types (): Person (firstName: String, lastName: String, birthYear: Int, address: String): Person match arguments (("Jane" : String), ("Doe" : String), (1900 : Int))。第三行正常工作。如果我用new创建对象,一切正常。
奇怪的是,如果我定义了一个二级构造函数,它的参数数量和我试图使用的构造函数的参数数量相同(但类型完全不同),它就可以工作。例如:

class Person(
    val firstName: String,
    val lastName: String,
    val birthYear: Int = -1,
    val address: String = ""
):
  def this(x: Int, y: Int) = this("John1", "Doe1")
  def this(x: Array[List[HashMap[Int, String]]], y: Boolean, z: Int) =
    this("John2", "Doe2")

@main
def main() = {
  val p1 = Person("John", "Doe")
  val p2 = Person("Jane", "Doe", 1900)
  val p3 = Person("Josh", "Doe", 1912, "Main Street")
} // no errors


有人能解释这种行为吗?

kwvwclae

kwvwclae1#

我能够复制并相信这是一个bug。我在Dotty存储库上提交了an issue
问题似乎源于universal apply methodsdefault parameter values之间的交互。本质上,编译器自动生成apply方法,这些方法转发到类的伴随对象中的构造函数。然而,这些方法不包括默认参数。假设:当只有一个构造函数时,编译器能够追溯到原始构造函数的默认参数,但当有多个构造函数时就不能了。

相关问题