2010-05-21 40 views
2

我試圖用擴展語義實現一種SortedMap。我試圖委託SortedMap作爲存儲,但無法避開方差約束:如何在委託另一個集合進行存儲時使用協方差實現集合?

class IntervalMap[A, +B](implicit val ordering: Ordering[A]) 
    //extends ... 
{ 
    var underlying = SortedMap.empty[A, List[B]] 
} 

這是我得到的錯誤。我明白爲什麼我得到的錯誤(我明白方差)。我沒有得到的是如何實現這種類型的委派。是的,B上的協方差是必需的。

error: covariant type B occurs in contravariant position in type scala.collection.immutable.SortedMap[A,List[B]] of parameter of setter underlying_= 

回答

5

你不能讓一個根本var,但你可以把它val

scala> import collection._ 
import collection._ 

scala> class IntervalMap[A, +B](implicit val ordering: Ordering[A]) { 
    | val underlying = SortedMap.empty[A, List[B]] 
    | } 
defined class IntervalMap 

在您的例子,var限定一對方法:

class IntervalMap[A, +B](implicit val ordering: Ordering[A]) { 
    def underlying_=(s: SortedMap[A, List[B]]) = // ... 
    def underlying: SortedMap[A, List[B]]) = // ... 
} 

對於類型參數B是同時出現在一個輸入和一個輸出,它必須是不變的。

相關問題