Scala: удобная привязка параметров типа коллекции

Для удобства, ясности и абстракции я хочу придумать другое имя для конкретной привязки параметризованного трейта коллекции. Например, сначала рассмотрим:

import collection.mutable.Map // NB: Map is a trait
val m1 = Map[String, Int]()   // uses the Map companion object to create a HashMap

Теперь я хочу заменить MyMap на Map[String, Int]. В идеале я просто хотел бы сделать что-то вроде:

trait MyMap extends Map[String, Int]
object MyMap extends Map[String, Int]   // not good enough by itself, need some apply defs
val m2 = MyMap()                        // nope

Я мог бы добавить больше материала к объекту-компаньону MyMap или сделать MyMap расширением HashMap[String, Int] и забыть о том, чтобы полагаться на волшебные значения по умолчанию внутри объекта-компаньона Map.

Но эти альтернативы кажутся слишком сложными для чего-то, что должно быть простым: я просто хочу, чтобы MyMap действовало как Map[String, Int], где бы оно ни появлялось. Как это сделать проще всего, или я упускаю какой-то более глубокий принцип?


person Dan Halbert    schedule 15.09.2011    source источник


Ответы (2)


Используйте псевдоним типа:

type MyMap = Map[String, Int]

Обратите внимание, что это не даст вам object MyMap, и если вы его определите, он не является сопутствующим объектом (object Map является), и компилятор не будет проверять его на наличие неявных преобразований.

person Alexey Romanov    schedule 15.09.2011
comment
Вы можете получить легкий доступ к фабричному методу (т. е. применить (..)) с помощью val MyMap = Map.apply[String, Int] _, но, опять же, это не сопутствующий объект, а всего лишь одна функция. - person Derek Wyatt; 15.09.2011
comment
val MyMap = Map даст вам компаньона. - person Daniel C. Sobral; 16.09.2011
comment
Однако val MyMap = Map не дает мне компаньона для Map[String, Int], чего я и хочу. - person Dan Halbert; 16.09.2011

@Alexey Romanov Псевдоним типа не даст вам фабричный метод. Импорт, с другой стороны, будет.

scala> import collection.mutable.{Map => MyMap}
scala> val m1 = MyMap()
m1: scala.collection.mutable.Map[Nothing, Nothing] = Map()
person agilesteel    schedule 15.09.2011
comment
Гм, но импорт делает MyMap другим именем для Map, а не Map[String, Int], как мне бы хотелось. - person Dan Halbert; 15.09.2011