2012-02-14 2 views
1

Каким-то образом я не могу правильно реализовать SortedMap. Вот минимальный (не) рабочий пример:Реализация пользовательской SortedMap в Scala

class MyMap[A](t: Map[Long, A]) extends SortedMap[Long, A] { 
    protected val internalMap = TreeMap(t.toArray: _*) 

    def -(key: Long) = MyMap(internalMap - key) 
    def get(key: Long) = internalMap.get(key) 
    def rangeImpl(from: Option[Long], until: Option[Long]) = TreeMap(internalMap.rangeImpl(from, until)) 
    def iterator = internalMap.iterator 
    def ordering = internalMap.ordering 
} 

Но, все, что я прохожу в MyMap конструктор, вызывая, например, его size, всегда возвращает 0.


Дополнение: Я просто скопировал код в новый проект, и он работал 8- \ В любом случае, позвольте мне изменить вопрос, чтобы сделать его полезным: это правильный способ расширения SortedMap?

+2

Чтобы ответить на ваше добавление вопросом: поскольку 'TreeMap' реализует' SortedMap', зачем его нужно обернуть в 'MyMap'? Почему бы просто не использовать «TreeMap» напрямую? (Просто для подтверждения: мы говорим о 'scala.collection.immutable.TreeMap', правильно?) –

+0

@ Крис: Это был минимальный рабочий пример :-) В реальной жизни я хочу повторно реализовать свои собственные функции для другого вида SortedMap. –

+0

И да, речь идет о 'scala.collection.immutable.SortedMap'. –

ответ

3

После добавления пары отсутствующих методов, чтобы сделать его компиляции, ваш код работал отлично для меня:

class MyMap[A](t: Map[Long, A]) extends SortedMap[Long, A] { 
    protected val internalMap = TreeMap(t.toArray: _*) 
    def +[B1 >: A](kv: (Long, B1)) = new MyMap(internalMap + kv) 
    def -(key: Long) = new MyMap(internalMap - key) 
    def get(key: Long) = internalMap.get(key) 
    def rangeImpl(from: Option[Long], until: Option[Long]) = internalMap.rangeImpl(from, until) 
    def iterator = internalMap.iterator 
    def ordering = internalMap.ordering 
} 

От РЕПЛ:

scala> t 
res5: Map[Long,String] = Map(123 -> abc, 456 -> def) 

scala> new MyMap(t) 
res6: MyMap[String] = Map(123 -> abc, 456 -> def) 

scala> res6.size 
res7: Int = 2 

я упускаю что-то?

Смежные вопросы