我有一个案例类,看起来像这样:
case class A(first: B*)(second: C*)
first
和second
都是重复的,因此我将放在单独的参数列表中。但是,我希望在许多情况下second
可能为空,因此能够像A(???, ???)
这样使用此类而不必在后面加上空括号会很好。我尝试了以下方法:case class A(first: B*)(second: C*) {
def this(first: B*) = this(first: _*)()
}
这给了我
ambiguous reference to overloaded definition
。有没有一种方法可以明确地编写此构造函数调用? (并且我能够调用重载的构造函数而不会再次使语法混乱)?我的猜测是不,有一些关于这种语法糖将如何中断curring的争论,但我更希望从有这种想法的人那里听到。比我更多的Scala知识;)
最佳答案
以下可能会实现您的目标:
case class Foo private(first: List[Int], second: List[Int])
object Foo {
def apply(first: Int*) = new Foo(first.toList, List.empty[Int]) {
def apply(second: Int*) = new Foo(first.toList, second.toList)
}
}
然后您可以执行以下操作:
Foo(1, 2, 3)
Foo(1, 2, 3)(4, 5, 6)
@SillyFreak编辑:此变体没有给出“结构类型成员的反射访问”警告,因此我认为应该在性能上更好一些:
case class Foo private (first: List[Int], second: List[Int])
object Foo {
def apply(first: Int*) = new Foo(first.toList, List.empty[Int]) with NoSecond
trait NoSecond {
self: Foo =>
def apply(second: Int*) = new Foo(first.toList, second.toList)
}
}
Foo(1, 2, 3)
Foo(1, 2, 3)(4, 5, 6)