调用Scala辅助构造函数时是否需要新的?

时间:2013-10-14 19:38:39

标签: scala constructor

当我在工作表中运行以下内容时,一切都按预期进行。

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文件中。

这是编译器错误,还是我误解了什么?

2 个答案:

答案 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 situationtour on case classes

答案 1 :(得分:1)

定义case类还将创建类名的工厂方法,因此在创建实例时不必使用new。所以下面的代码工作文件:

P(1, Set())

您的类也有构造函数,以下代码也可以正常工作:

new P(1, Set())
new P(1)

P(1)的情况下,没有这样的方法,因此发生错误。