2012-03-13 2 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() 

Так почему же мне нужно явно бросить BitSet до Set[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' _ то же самое. Вы имеете в виду 'Set' из' Predef'. –

+0

К сожалению, правильно! Теперь я понял! Спасибо за исправление! –

+0

Примечание: я удалил свой первый комментарий, на который ответил @Rex, потому что это было неправильно и вводило в заблуждение. –