2013-04-17 44 views
2

我想在Scala中擴展一組整數。基於earlier answer我決定使用SetProxy對象。我現在試圖實現newBuilder機制,如第二版的第25章中所述,在Scala中編程,並且遇到了麻煩。具體而言,我無法弄清楚要指定給SetBuilder對象的參數。這是我嘗試過的。如何爲scala集指定newBuilder?

package example 

import scala.collection.immutable.{HashSet, SetProxy} 
import scala.collection.mutable 

case class CustomSet(override val self: Set[Int]) extends SetProxy[Int] { 
    override def newBuilder[Int, CustomSet] = 
    new mutable.SetBuilder[Int, CustomSet](CustomSet()) 
} 

object CustomSet { 
    def apply(values: Int*): CustomSet = CustomSet(HashSet(values.toSeq: _*)) 
} 

這不會編譯。這是錯誤。

scala: type mismatch; 
found : example.CustomSet 
required: CustomSet 
    override def newBuilder[Int, CustomSet] = new mutable.SetBuilder[Int, CustomSet](CustomSet()) 
                         ^

這對我來說很神祕。我已經嘗試了有問題的價值的各種變化,但他們都沒有工作。我如何進行編譯?

除了在斯卡拉編程我已經瀏覽了各種StackOverflow帖子,如this one,但仍然神祕。

回答

1

給這一個鏡頭:

case class CustomSet(override val self: Set[Int]) extends SetProxy[Int] { 
    override def newBuilder = new mutable.SetBuilder[Int, Set[Int]](CustomSet()) 
} 

object CustomSet { 
    def apply(values: Int*): CustomSet = CustomSet(HashSet(values.toSeq: _*)) 
} 

在創建SetBuilder,指定CustomSet作爲第二Param類型不符合開往param所的類型。將其切換爲Set[Int]符合該條件,並允許您仍然傳入CustomSet作爲構造函數arg。希望這可以幫助。

+0

代理類看起來像是一種理想的方式(有效地)從具有不希望被分類的實現類的特性中繼承。但是,從Scala 2.11.0開始,它們已被[棄用](http://stackoverflow.com/questions/24312563)。 –

相關問題