Почему BitSet требует, чтобы явное приведение считалось экземпляром Set [Int]? - PullRequest
6 голосов
/ 14 марта 2012

В скаладоке 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]?

1 Ответ

9 голосов
/ 14 марта 2012

Оказывается, ваш 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).

...