2012-03-13 34 views
6

在scaladoc中,BitSet定义为延伸Set[Int]。所以我想用BitSet如在Set[Int]实例会的工作,但我得到一个类型不匹配:为什么BitSet要求将显式强制转换视为Set [Int]的实例?

Welcome to Scala version 2.9.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_29). 

scala> import collection.BitSet 
import collection.BitSet 

scala> val b: Set[Int] = BitSet() 
<console>:8: error: type mismatch; 
found : scala.collection.BitSet 
required: Set[Int] 
     val b: Set[Int] = BitSet() 
          ^

然而铸造的工作原理:

scala> val b: Set[Int] = BitSet().asInstanceOf[Set[Int]] 
b: Set[Int] = BitSet() 

那么,为什么我需要明确地投下BitSetSet[Int]Set[Int]Set[Int]的超级类型?

回答

9

事实证明,你的Set实际上是scala.collection.immutable.Set。所以,你可以但

val b0: Set[Int] = collection.immutable.BitSet() 
val b1: collection.Set[Int] = collection.BitSet() 
val b2: collection.immutable.Set[Int] = collection.immutable.BitSet() 
val b3: collection.mutable.Set[Int] = collection.mutable.BitSet() 
val b4: collection.Set[Int] = collection.immutable.BitSet() 
val b5: collection.Set[Int] = collection.mutable.BitSet() 

没有任何

val x1: collection.immutable.Set[Int] = collection.BitSet() 
val x2: collection.immutable.Set[Int] = collection.mutable.BitSet() 
val x3: collection.mutable.Set[Int] = collection.BitSet() 
val x4: collection.mutable.Set[Int] = collection.immutable.BitSet() 

,它原来是为Set默认的导入给你x2。进口collection.immutable.BitSet或进口collection.Set(覆盖collection.immutable.Set)。

+0

@jullybobble - 你还是很困惑。 'collection.Set'和'scala.collection.Set'是_完全一样的东西_。你的意思是来自'Predef'的'Set'。 – 2012-03-13 21:36:18

+0

哎呀,对!现在我懂了!感谢您的更正! – 2012-03-13 22:51:32

+0

注:我删除了我对@Rex回答的第一条评论,因为这是错误的和误导性的。 – 2012-03-14 07:29:22

相关问题