2011-07-15 31 views
15

Tôi cố gắng xây dựng một danh sách các bộ (có thể thay đổi và không biến đổi). Trình biên dịch gặp rắc rối vì nó không thể tìm ra loại danh sách đó. Tôi luôn nghĩ rằng tôi có thể kết nối Danh sách bất kỳ loại nào và loại Danh sách mới là một loại siêu kiểu của Danh sách được kết nối. Trong ví dụ sau, tôi xác định một số danh sách. Bạn có thể xem các loại những danh sách, được đưa ra bởi trình biên dịch:Làm thế nào để có được một danh sách (không thay đổi và có thể thay đổi) Bộ trong scala?

val intList = List(1) //List[Int] 
val stringList = List("ab") //List[java.lang.String] 
val mSetList = List(mutable.Set(1, 2, 3)) //List[scala.collection.mutable.Set[Int]] 
val iSetList = List(immutable.Set(1, 2, 3)) //List[scala.collection.immutable.Set[Int]] 

Bây giờ tôi sử dụng toán tử ::: để kết nối các danh sách này:

val intStringList = intList:::stringList //List[Any] 
val intMSetList = intList:::mSetList //List[Any] 
val intISetList = intList:::iSetList //List[Any] 

Đúng như dự đoán, trình biên dịch sẽ tính toán một supertype chung (List[Any]) của cả hai danh sách. Nhưng những điều sau đây không biên dịch:

val iSetmSetList = iSetList:::mSetList //type error 

Nhưng nếu tôi một cách rõ ràng "diễn viên" hai danh sách, nó hoạt động:

val setList1 : List[scala.collection.Set[Int]] = mSetList //List[scala.collection.Set[Int]] 
val setList2 : List[scala.collection.Set[Int]] = iSetList // List[scala.collection.Set[Int]] 
val setList = setList1:::setList2 //List[scala.collection.Set[Int]] 

Tại sao tôi phải giúp trình biên dịch để có được đúng loại đó danh sách? Và tại sao nó tạo ra lỗi hơn là chỉ cần gõ nó với List[Any]? Về mặt lý thuyết là không thể tính toán loại List[scala.collection.Set[Int]] hoặc nó là một loại lỗi trong trình biên dịch?

Cảm ơn rất nhiều cho câu trả lời của bạn :-)

+4

Điều đó làm cho tôi nghĩ về http: // stackoverflow. com/questions/5734755/scala-type-widening-inference-of-foott-tt được sửa với https://issues.scala-lang.org/browse/SI-4501. Giá trị một shot cố gắng với một đêm gần đây hơn 6/25? – huynhjl

Trả lời

5

Đó là một lỗi, và được cố định trong các phiên bản hàng đêm, như huynhjl nghi ngờ:

Welcome to Scala version 2.10.0.r25234-b20110705020226 
    (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_24) 
Type in expressions to have them evaluated. 
Type :help for more information. 
. . . 
scala> val iSetmSetList = iSetList:::mSetList //type error 
iSetmSetList: List[scala.collection.Set[Int]] = List(Set(1, 2, 3), Set(2, 1, 3)) 
Các vấn đề liên quan