如何在case类中指定多个构造函数?

时间:2015-11-01 15:42:14

标签: scala

我正在尝试创建一个包含多个构造函数的case类:

object App {
  def main(args: Array[String]) {
    val a = Something("abc", 100500, _ % 2 == 0)
    val b = Something(true, 10, 20)   
    println(s"$a - $b")
  }
}

case class Something(s: String, n: Int, p: Int => Boolean) {
  /*
  Additional constructor -- Wrong way! -- it is imposible to invoke it outside the class
  def this(b: Boolean, x: Int, y: Int) {
    this("", 0, (i: Int) => i % x + y == 0)
  }
  */
}

到目前为止,我的代码无效:

Error:(10, 23) type mismatch;
 found   : Boolean(true)
 required: String
    val b = Something(true, 10, 20)
                      ^

要修复它,我需要创建一个伴随对象来保存一个apply函数,该函数表示Something类的新构造函数:

object Something {    
  def apply(b: Boolean, x: Int, y: Int) = {
    new Something(if (b) "" else "default", 0, _ => {
      (x + y) % 2 == 0
    })
  }   
}

不方便。也许还有其他方法可以将多个构造函数放入case类中?

1 个答案:

答案 0 :(得分:13)

实际上它可行,但你必须使用new,因为辅助构造函数没有为案例类生成apply

case class Something(s: String, n: Int, p: Int => Boolean) {
  def this(b: Boolean, x: Int, y: Int) {
    this("", 0, (i: Int) => i % x + y == 0)
  }
}

new Something(true, 5, 5) // Works

如果你想要Something(true, 5, 5)工作,你需要像你说的那样创建伴侣对象。我认为这是因为否则案例类不能像现在一样处理模式匹配,或者它本来会复杂得多。并注意到模式匹配在这种情况下不起作用

还要记住,case类支持像case class Something(s: String = "default")这样的默认构造函数,这可能对你有所帮助,但不幸的是它并没有修复你的例子