在委托给另一个集合进行存储时如何实现具有协方差的集合?

时间:2010-05-21 18:35:00

标签: scala scala-2.8

我正在尝试使用扩展语义实现一种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_=

1 个答案:

答案 0 :(得分: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,它必须是不变的。