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
型
有人能解释这种行为吗?
1条答案
按热度按时间kwvwclae1#
我能够复制并相信这是一个bug。我在Dotty存储库上提交了an issue。
问题似乎源于universal apply methods和default parameter values之间的交互。本质上,编译器自动生成
apply
方法,这些方法转发到类的伴随对象中的构造函数。然而,这些方法不包括默认参数。假设:当只有一个构造函数时,编译器能够追溯到原始构造函数的默认参数,但当有多个构造函数时就不能了。