2013-02-05 97 views
3

這裏是基本的例子..我不能讓scala認識到我希望能夠以兩種不同的方式初始化我的類:通過現有序列或使用多個參數。Scala中具有多參數或序列的構造函數?

我收到的錯誤是:

雙重定義:方法適用:(PARAMS: 詮釋*)chorle.scala.tests.MultiParam和方法適用於:(plist中:
序號[INT]) chorle.scala.tests.MultiParam第9行有相同類型之後 擦除:(PARAMS:SEQ)chorle.scala.tests.MultiParam

哪個好,我得到了什麼這裏發生 - 編譯後兩者的功能導致在相同的頭部簽名中。但是,實際上它們的工作方式並不一樣 - 我無法啓用:apply(1,2,3)如果我只有apply(Seq)版本...並且我無法啓用apply(seq)the其他方式。我知道我可以用各種方法修補實際的函數調用,但是我怎樣才能在課堂上恰當地解決這個問題並且只有一次?謝謝!

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) 


} 

回答

4

那麼,他們不能像現在這樣使用,因爲沒有辦法生成這兩種方法。圍繞它的唯一辦法是消除歧義他們:

object MultiParam { 
    def apply(pList:Seq[Int]): MultiParam = new MultiParam(pList) 
    def apply(param: Int, params: Int *): MultiParam = new MultiParam(param +: params) 
    def apply(): MultiParam = new MultiParam(Nil) 
} 
5

的問題來自於一個事實,即所謂的「重複PARAMS」形式是語法糖,兩者在定義站點和調用網站一種特殊的的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) 
    } 
} 

在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]] 
+0

和當然,我忽略了零參考的情況下! –