Атрибут класса в scala

Возможно ли в Scala определить MyAlias[A] как псевдоним для MyClass[String, A]. Например, MyAlias[Int] будет ссылаться на Map[String, Int].

Ответ 1

Обратите внимание, что Map является trait, а не class.

Вы все еще можете использовать его с помощью ключевого слова type:

type StringMap[A] = Map[String, A]

val myMap: StringMap[Int] = Map("a" -> 1)

Это можно сделать в рамках определения class, object или trait (и в рамках любого метода или выражения).

Иногда вам нужно, чтобы псевдоним был закрыт для области объявления, просто как удобство для вашего кода реализации. Если вы хотите, чтобы тип использовался в целом, Объекты пакета полезны:

package object mypackage {
  type StringMap[A] = Map[String, A]
}

Поскольку Map является признаком (и ассоциированным сопутствующим объектом), а не классом, вы не сможете использовать его напрямую для создания экземпляров:

val myMap = new StringMap[Int]
// error: trait Map is abstract; cannot be instantiated

Если вы используете псевдоним класса, вы все равно можете использовать ключевое слово new:

type StringHashMap[A] = HashMap[String, A]
val myMap = new StringHashMap[Int]