当我在工作表中运行以下内容时,一切都按预期进行。
case class P(x: Int, xs: Set[Int]) {
def this(x: Int) = this(x, Set[Int]())
}
P(1, Set()) //> res0: worksheet.P = P(1,Set())
new P(1) //> res0: worksheet.P = P(1,Set())
当我离开新时,我会得到一个编译器诊断信息:
- not enough arguments for method apply: (x: Int, xs: Set[Int])worksheet.P in object P. Unspecified value parameter xs.
相同的诊断显示在常规的.scala文件中。
这是编译器错误,还是我误解了什么?
答案 0 :(得分:2)
如果没有新的,你调用的不是构造函数,而是工厂方法,它是由编译器为case类自动生成的。您可以定义新的:
case class P(x: Int, xs: Set[Int])
object P {
def apply(x: Int): P = P(x, Set[Int]())
}
scala> P(1, Set())
res2: P = P(1,Set())
scala> P(1)
res3: P = P(1,Set())
或者您可以使用定义两个构造函数,但在您的特定情况下,我将使用默认值:
case class P(x: Int, xs: Set[Int] = Set[Int]())
另请参阅this answer which showcases similar situation和tour on case classes
答案 1 :(得分:1)
定义case类还将创建类名的工厂方法,因此在创建实例时不必使用new
。所以下面的代码工作文件:
P(1, Set())
您的类也有构造函数,以下代码也可以正常工作:
new P(1, Set())
new P(1)
在P(1)
的情况下,没有这样的方法,因此发生错误。