2012-03-13 37 views
6

Trong scaladoc, BitSet được định nghĩa là mở rộng Set[Int]. Vì vậy, tôi nghĩ rằng sử dụng một BitSet như trong trường hợp của Set[Int] sẽ làm việc, nhưng tôi nhận được một loại không phù hợp:Tại sao BitSet yêu cầu một diễn viên rõ ràng được coi là một thể hiện của 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() 
          ^

Tuy nhiên một dàn diễn viên hoạt động:

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

Vậy tại sao tôi cần phải explicitely cast một BitSet đến một số Set[Int] trong khi Set[Int] là siêu loại Set[Int]?

Trả lời

9

Nó chỉ ra rằng Set của bạn thực sự là scala.collection.immutable.Set. Vì vậy, bạn có thể

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() 

nhưng không phải bất kỳ

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() 

và nó chỉ ra rằng việc nhập khẩu mặc định cho Set mang đến cho bạn x2. Nhập collection.immutable.BitSet hoặc nhập collection.Set (để che collection.immutable.Set).

+0

@jullybobble - Bạn vẫn còn bối rối. 'collection.Set' và' scala.collection.Set' là _exactly cùng một điều_. Ý bạn là 'Set' từ' Predef'. –

+0

Rất tiếc, đúng! Bây giờ tôi đã nhận nó! Cảm ơn vì sự đúng đắn của bạn! –

+0

Lưu ý: Tôi đã xóa nhận xét đầu tiên của mình về @Rex đã trả lời vì nó sai và gây nhầm lẫn. –

Các vấn đề liên quan