scala中的类别名

khe*_*aud 11 alias scala

Scala中是否可以将其定义MyAlias[A]为别名MyClass[String, A].例如,MyAlias[Int]会参考Map[String, Int].

Ben*_*mes 19

注意Map是a trait,而不是a class.

您仍然可以使用type关键字对其进行别名:

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

val myMap: StringMap[Int] = Map("a" -> 1)
Run Code Online (Sandbox Code Playgroud)

这可以的范围内进行class,object或者trait定义(和以任何方法或表达的范围).

有时您会希望别名对其声明范围是私有的,纯粹是为了实现代码的便利.如果您希望该类型通常可用,则Package Objects有用:

package object mypackage {
  type StringMap[A] = Map[String, A]
}
Run Code Online (Sandbox Code Playgroud)

因为Map是特征(和关联的伴随对象)而不是类,所以您将无法直接使用它来创建实例:

val myMap = new StringMap[Int]
// error: trait Map is abstract; cannot be instantiated
Run Code Online (Sandbox Code Playgroud)

但是,如果您为一个类别名,您仍然可以使用new关键字:

type StringHashMap[A] = HashMap[String, A]
val myMap = new StringHashMap[Int]
Run Code Online (Sandbox Code Playgroud)