我有一个案例类,看起来像这样:

case class A(first: B*)(second: C*)


firstsecond都是重复的,因此我将放在单独的参数列表中。但是,我希望在许多情况下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)

07-26 00:15