本文是在“Scala热情交流群(132569382)”的讨论中整理而成。
当程序需要使用scala.collection.mutable.Map的时候,可以通过导入(import)语法:
import scala.collection.mutable.{ Map => MMap }
然后这样使用:
val map = MMap[String,String]()
能否改成这样呢?
type Kap[K,V] = scala.collection.mutable.Map[K,V]
val data = MMap[String,String]()
结果发现编译报错,提示 "not found: value KMap"
KMap明明已经定义了,为什么找不到呢? 实际上 import scala.collection.mutable.{ Map => MMap }是把 scala.collection.mutable.Map的特征(trait)和伴随对象(companion object)一起导入了. 当你这样使用的时候:
def func(map: MMap[String,String]) = {
// ...
}
Scala知道MMap是一个特征的别名,当你这样使用的时候:
val map = MMap[String,String]()
Scala知道你是调用了伴随对象scala.collection.mutable.Map的apply()方法,然后用变量map保存apply()的结果(注意:如果写成MMap[String,String],则是把伴随对象scala.collection.mutable.Map的引用赋值给变量map); 而 type KMap[K,V] = scala.collection.mutable.Map[K,V] 只是给特征取个别名,因此标识符KMap只能用于类型声明,比如
val map: KMap[String,String] = null;
def func(map: kMap[String,String] ) = null
PS: 如果大家对Scala有浓厚的性趣,欢迎加入群132569382。在这里感谢风自由和唐古拉山提供讨论的素材。