我正在尝试创建一个包含多个构造函数的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类中?
答案 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")
这样的默认构造函数,这可能对你有所帮助,但不幸的是它并没有修复你的例子