Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2011-09-13) type A=B不等于import {A=>B}

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

今天被一个问题折磨了很久,最后才想明白。

在检查代码的时候,发现不少类为了使用mutable的map,都进行了这样的导入:

import scala.collection.mutable.{ Map => MMap }

然后这样使用:

val map = MMap[String,String]

于是想,何不把它放到一个package object中,这样就不需要到处导入了。于是:

package org
package object scalaeye {
    type MMap[K,V] = scala.collection.mutable.Map[K,V]
}

然后去掉了其它类中的import {Map=>MMap}的导入声明。结果发现编译时,所有使用了MMap的类,都报错:找不到type MMap。


MMap明明已经定义了,为什么找不到呢?简化问题为:

class Test {
    type MMap[K,V] = scala.collection.mutable.{Map=>MMap}
    val data = MMap[String,String]()
}

还是报找不到MMap,可是明明就在前面定义了!

调试了好久,突然想起之前问过这个问题,答案也差不多想起来了。

type MMap[K,V] = scala.collection.mutable.Map[K,V]

import scala.collection.mutable.{ Map => MMap }

这两者右边的Map是不一样的。第一个是trait Map,第二个是object Map。第一个像是一个接口,并没有apply()函数可让我们调用,所以MMap()出错。而第二个,实际上还是object Map,我们可以调用它的()函数

下面是唐古拉山的回贴:

import scala.collection.mutable.{ Map => MMap }
-> Map trait及其伴生对象都可见了

如:

classOf[MMap[_,_]]
MMap()

scala 知道什么时候是trait,什么时候object
看看Predef里对immuable.Map的导入

...
type Map[A, +B] = collection.immutable.Map[A, B] //类型别名
val Map = collection.immutable.Map //引用对象
...
comments powered by Disqus