在Scala中具有多参数或序列的构造函数?

Lal*_*lin 3 scala

这是基本的例子..我不能让scala认识到我希望能够以两种不同的方式初始化我的类:通过现有序列,或使用多个参数.

我收到的错误是:

double definition:方法apply:(params:Int*)chorle.scala.tests.MultiParam和方法apply:(pList:
Seq [Int])第9行的chorle.scala.tests.MultiParam在擦除后有相同的类型:( params: SEQ)chorle.scala.tests.MultiParam

哪个好,我得到了这里发生的事情 - 后期编译两个函数都会产生相同的标题签名.然而,在实践中它们的工作方式不同 - 我无法调用:如果我只有apply(Seq)版本,则应用(1,2,3)...并且我不能使用apply(seq)其他方式.我知道可以修补实际函数调用的各种方法,但是如何正确地解决这个问题并且只在课堂上进行一次?谢谢!

class MultiParam protected (pList:Seq[Int]) 

object MultiParam {
  def apply(pList:Seq[Int]): MultiParam = new MultiParam(pList)
  def apply(params: Int *): MultiParam = new MultiParam(params)


} 
Run Code Online (Sandbox Code Playgroud)

Ran*_*ulz 5

问题来自这样一个事实,即所谓的"重复参数"形式是语法糖,无论是在定义网站还是在特殊类型的调用网站上IndexedSeq,都会导致模糊性.

有一种处理方式的库存方式,您可以在标准集合库中的不同位置找到它:

package rrs.scribble

object MP {
  class MultiParam protected (pList:Seq[Int]) {
    override def toString: String = pList.mkString("[[", ", ", "]]")
  }

  object MultiParam {
    def apply(): MultiParam = new MP.MultiParam(List.empty[Int])
    def apply(ints: Seq[Int]): MultiParam = new MP.MultiParam(ints)
    def apply(i1: Int, iMore: Int*): MultiParam = new MP.MultiParam(i1 +: iMore)
  }
}
Run Code Online (Sandbox Code Playgroud)

在REPL中:

scala> MultiParam()
res0: rrs.scribble.MP.MultiParam = [[]]

scala> MultiParam(12)
res3: rrs.scribble.MP.MultiParam = [[12]]

scala> MultiParam(12, 34)
res4: rrs.scribble.MP.MultiParam = [[12, 34]]

scala> MultiParam(12, 34, 56)
res5: rrs.scribble.MP.MultiParam = [[12, 34, 56]]
Run Code Online (Sandbox Code Playgroud)