9 lần trong số 10, bạn chỉ cần sử dụng Map
và Set
cư xử như tôi mong đợi họ sẽ, nhưng đôi khi tôi bất ngờ nhấn vớiTại sao Bản đồ và Đặt bí danh trong scala.Predef?
error: type mismatch;
[INFO] found : scala.collection.Set[String]
[INFO] required: Set[String]
Như một ví dụ, từ REPL:
scala> case class Calculator[+T](name: String, parameters: Set[String])
defined class Calculator
scala> val binding=Map.empty[String, String]
binding: scala.collection.immutable.Map[String,String] = Map()
scala> Calculator("Hello",binding.keySet)
<console>:9: error: type mismatch;
found : scala.collection.Set[String]
required: Set[String]
Calculator("Hello",binding.keySet)
^
tôi nghĩ rằng tôi hiểu được lỗi, đó là, các cuộc gọi chức năng trên các loại bí danh trả về các loại thực tế.
Và do đó, có vẻ như với tôi giải pháp là nhập các loại chưa được đặt bí danh. Khi mà mọi tệp khác trong dự án của tôi bây giờ sẽ tạo ra các lỗi không khớp loại, vì vậy tôi sẽ phải nhập nó vào mỗi tệp. Dẫn đến câu hỏi tôi hỏi trong tiêu đề - mục đích của bí danh trong Predef là gì, nếu cuối cùng tôi cần phải nhập gói thực tế?
Sự hiểu biết của tôi có thiếu sót hay trường hợp sử dụng của tôi không phải là trường hợp điển hình hoặc cả hai?
Cảm ơn - Điều đó có ý nghĩa khi tôi nhìn vào nó. Nhưng tôi đoán câu hỏi của tôi sẽ trở thành 'Làm thế nào tôi có thể làm cho mã này làm những gì tôi muốn với tối thiểu cruft?' Nếu tôi cần phải chuyển đổi/chuyển đổi từ kiểu này sang kiểu khác cũng như sử dụng tên đủ điều kiện cho một ca sử dụng đơn giản như trường hợp trên, tôi cho rằng tôi phải làm sai. – Jim
Bạn luôn có thể gọi .toSet trên bộ sưu tập bất kỳ để có được bộ không thay đổi. Bạn có thể hoặc có thể không làm điều gì đó sai: điều này chủ yếu chỉ là những gì xảy ra khi bạn mặc định bất biến nhưng cả thế giới (bao gồm cả thế giới của riêng bạn) không cung cấp cho bạn những thứ bất biến. – extempore
lý do tại sao immutable.Map # keySet không trả về một biến đổi.Set? – gerferra