Как расширить карту в Scala? - PullRequest
       34

Как расширить карту в Scala?

3 голосов
/ 23 февраля 2012

Я пытаюсь написать собственный класс, расширяющий Map[DateTime, T].Расширенный класс должен принимать Map[DateTime, T] в качестве аргумента конструктора и вызывать соответствующие методы предоставленной карты для каждого метода, который Map должен реализовать.

У меня не было проблем с написанием

def -(key: DateTime) = iv.-(key)
def get(key: DateTime) = iv.get(key)

но я застрял на

+[B1 :>B](kv: (A, B1)):Map[A, B1]

Как мне написать это?

Разве не существует простой ссылочной Map реализации оболочки, с которой можно начать?

PS: не предлагайте объявлять его как type DtMap[T] = Map[DateTime, T] - мне нужно будет добавить свои собственные методы в класс.

ОБНОВЛЕНИЕ: Итак, результат выглядит так, чтобыобъедините его, чтобы кто-нибудь смог использовать его в качестве отправной точки для своего расширения Map (может, у решения есть некоторые скрытые проблемы - пожалуйста, дайте мне знать):

case class DtValMap[T](iv: Map[DateTime, T]) extends Map[DateTime, T] {
  def -(key: DateTime) = new DtValMap(iv.-(key))
  def get(key: DateTime) = iv.get(key)
  def +[T1 >: T](kv: (DateTime, T1)): DtValMap[T1] = new DtValMap(iv + kv)
  def iterator: Iterator[(DateTime, T)] = iv.iterator
}

ОБНОВЛЕНИЕ2:обратил внимание на опечатку, которая стала причиной проблемы: у меня было :> (неправильно) вместо >:.Но я намеренно не исправляю это в вышеприведенном тексте, так как в этом вопросе нет смысла.

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

Рассматривали ли вы MapProxy? Это не рекомендуется в Scala 2.11, поэтому следует избегать этого конкретного решения.

В любом случае, если вы настаиваете на расширении Map и предоставлении всего его API, в чем конкретно заключается проблема с реализацией +? Почему это не работает?

def +[B1 >: T](kv: (DateTime, B1)):Map[DateTime, B1] = new YourMap(iv + kv)
0 голосов
/ 23 февраля 2012

Если я правильно понимаю, есть

class YourMap[T](iv: Map[DateTime, T]) extends Map[DateTime, T] 

Разве ты не можешь просто сделать

def +[T1 >: T](kv: (DateTime, T1)): YourMap[T1] = new YourMap(iv + kv)

Я не слишком уверен в вашем def -. Если я правильно понимаю, он возвращает карту, а не YourMap. Если это нормально, почему вы не можете сделать то же самое для +?

В строке type DtMap[T] вы рассматривали возможность добавления метода с pimp my library, а не с расширением класса? Коллекционные классы сложны, и поэтому расширяют их.

...