Как реализовать коллекцию с ковариацией при делегировании другой коллекции для хранения? - PullRequest
2 голосов
/ 21 мая 2010

Я пытаюсь реализовать тип 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 Ответ

5 голосов
/ 21 мая 2010

Вы не можете сделать под 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 отображался как на входе, так и на выходе, он должен быть инвариантным.

...