Scala: удобное связывание параметров типа коллекции - PullRequest
2 голосов
/ 15 сентября 2011

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

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], где бы он ни появлялся.Какой самый простой способ сделать это, или я упускаю какой-то более глубокий принцип?

Ответы [ 2 ]

4 голосов
/ 15 сентября 2011

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

type MyMap = Map[String, Int]

Обратите внимание, это не даст вам object MyMap, и если вы определите его, это будет , а не объект-компаньон (object Mapis) и компилятор не будет проверять его на неявные преобразования.

0 голосов
/ 15 сентября 2011

@ Алексей Романов Псевдоним типа не даст вам фабричный метод.Импорт с другой стороны будет.

scala> import collection.mutable.{Map => MyMap}
scala> val m1 = MyMap()
m1: scala.collection.mutable.Map[Nothing, Nothing] = Map()
...