Скала "Это" и MapLike - PullRequest
       13

Скала "Это" и MapLike

3 голосов
/ 05 августа 2011

Скажем, я хотел расширить черту Scala MapLike с помощью конкретной реализации IntIntMap.Для этого мне нужно реализовать следующие методы:

def get(key: A): Option[B]
def iterator: Iterator[(A, B)]
def + [B1 >: B](kv: (A, B1)): This
def -(key: A): This

Что такое тип This?Должна ли моя подпись переопределенного метода быть

override def +=(kv: (Int, Int)): IntIntMap = {
  // logic
}

или просто scala.reflect.This?Как насчет определения класса?Должно ли это быть,

class IntIntMap(...) extends MapLike[Int,Int,This] { ... }

или что-то совсем другое?

Ответы [ 3 ]

5 голосов
/ 05 августа 2011

Вы должны расширить MapLike[Int, Int, IntIntMap], и This станет IntIntMap.

2 голосов
/ 05 августа 2011

Сначала вы должны взглянуть на Архитектура коллекций Scala . Он показывает, как интегрировать ваши собственные коллекции.

Однако у вас возникнут проблемы с реализацией метода + в вашем примере, поскольку он должен позволять добавлять значения, соответствующие супертипу типа Int, и возвращать соответствующий Map. Поскольку This должно быть Map[Int,Int], у вас возникнут проблемы.

Я бы порекомендовал просто где-нибудь определить тип:

type MapIntInt = Map[Int,Int]

и, в конечном итоге, использовать импликации, чтобы привести конкретные методы.

1 голос
/ 05 августа 2011

Не зарезервированное слово, не имя какого-либо класса, а параметр третьего типа в MapLike. Объявление типа MapLike[K, +V, +This <: MapLike[K, V, This]. Это можно назвать любым другим способом. В большинстве случаев это должен быть фактический класс разработчика, отсюда и название. в вашем случае

class IntIntMap extends MapLike [Int, Int, IntIntMap]. 

Без этого параметра + тип результата был бы объявлен MapLike, а не IntIntMap. На + это не будет проблемой, потому что вы должны определить это, и, делая это, вы можете изменить тип результата. Но методы, которые вам не нужно переопределять и которые реализованы с использованием + (например, ++, все равно будут возвращать MapLike.

...