Ввод коллекций Scala - PullRequest
       7

Ввод коллекций Scala

3 голосов
/ 22 января 2011

Я хотел изучить новый фреймворк коллекций Scala, создав очень общее дерево префиксов. Ключи и значения должны быть не только параметрами, но и тип карт, используемых в каждом узле, также должен быть параметрами. Итак, я попробовал это:

import collection.immutable.MapLike

class PrefixMap[+M[K1,+V1] <: Map[K1,V1] with MapLike[K1,V1,M[K1,V1]],K,+V](val content: Option[V], val children: M[K,PrefixMap[M,K,V]])
  extends Map[Iterable[K],V]
  with MapLike[Iterable[K],V,PrefixMap[M,K,V]] {

    override def empty: PrefixMap[M,K,V] = new PrefixMap[M,K,V](None, children.empty)
}

Но это не компилируется:

PrefixMap.scala:19: error: type mismatch;
 found   : scala.collection.immutable.Map[K,PrefixMap[M,K,V]]
 required: M[K,PrefixMap[M,K,V]]
    override def empty: PrefixMap[M,K,V] = new PrefixMap[M,K,V](None, children.empty)
                                                                               ^
one error found

Это смущает меня. Из документации видно, что в MapLike есть пустое значение, возвращающее «This». Итак, поскольку children относится к типу M [K, PrefixMap [M, K, V]], children.empty также должен быть этого типа.

Что происходит, и можно ли это исправить?

1 Ответ

3 голосов
/ 23 января 2011

Ну, проблема в том, что MapLike определяет empty, который возвращает This, но Map.empty возвращает Map!

Попробуйте, например:

override def empty: PrefixMap[M,K,V] = new PrefixMap[M,K,V](None, (children: MapLike[K,PrefixMap[M,K,V],M[K,PrefixMap[M,K,V]]]).empty)

Это скомпилируется, потому что вы скрываете тип Map. Код не скомпилируется, потому что в нем отсутствуют абстрактные методы, но это другой вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...