2013-02-12 25 views
5

Nếu chúng tôi sử dụng bản đồ thì không cần phải nhập khẩu bất biến đồTại sao Bản đồ Scala được tự động nhập nhưng HashMap thì không?

scala> val map=Map[String,Int]() 
map: scala.collection.immutable.Map[String,Int] = Map() 

Nhưng nếu chúng ta sử dụng HashMap, sau đó mà không thực hiện nhập khẩu, nó mang lại cho lỗi.

scala> val a=HashMap[Int,Int]() 
<console>:7: error: not found: value HashMap 
     val a=HashMap[Int,Int]() 
      ^

nhưng nhập scala.collection.immutable.HashMap, nó hoạt động.

Tôi cũng nhìn thấy nó với Set và Hashset ..

tôi nhận thấy một điều rằng Bản đồ và Set là đặc điểm và HashSet, HashMap các lớp học.

Vậy tại sao lại như vậy ???

EDIT

Lớp Stack và Queue là cũng tồn tại trong gói scala.collection. thì tại sao chúng ta cần phải nhập các lớp này. ???

+0

'' 'đồ val = Map()' '' sẽ làm điều tương tự, vì Map là không thay đổi. và '' '> bản đồ + (" Ahoy "-> 0)' '' hoạt động, nhờ hiệp phương sai. – jwinandy

+0

Đối với Stack và Queue, tôi nghĩ chúng ít được sử dụng nhiều hơn là List, Set và Map. –

+0

Tôi không chắc chắn nhưng tôi nghĩ rằng, đây là những lớp học như HashMap. do đó chúng không được tự động nhập khẩu như câu trả lời của bạn "Chương trình cho một giao diện, không phải là một triển khai" cho thấy. – Rishi

Trả lời

3

Đó là vì Predef được nhập hoàn toàn. Trong số những người khác, nó chứa phương pháp nhà máy cho các đặc điểm chung như Map. HashMap là một triển khai cụ thể, vì vậy nếu bạn đã sử dụng phương pháp nhà máy của mình với suy luận kiểu, bạn sẽ thực hiện chặt chẽ việc kê khai của mình để triển khai.

+0

Tại sao Bản đồ lại được đưa vào Predef, trong khi HashMap thì không? –

1

Trong Scala, nó là thành ngữ để thích các loại không thay đổi, do đó, chúng được tạo sẵn theo mặc định. Nếu bạn muốn đột biến, bạn phải nói rõ ràng như vậy.

Lý do tiềm năng khác (và tôi đoán là) HashMap Bản đồ và trong nhiều trường hợp bạn không thực sự quan tâm đến việc triển khai bản đồ cụ thể nào, bạn chỉ muốn một thứ có thể kết hợp phím với các giá trị và có tra cứu nhanh hợp lý. Vì vậy, nó trừu tượng hơn để chỉ nói Map ("foo" -> "bar") hơn HasArrayMappedTrie ("foo" -> "bar").

+0

Nhưng nếu chúng ta sẽ cố gắng sử dụng hàng đợi bất biến mà không cần nhập scala.collection.immutable.Queue, thì nó không hoạt động. trong khi cả Bản đồ và Hàng đợi đều nằm trong gói scala.collection. Tại sao nó như vậy ?? – Rishi

+1

Như thSoft nói dưới đây, đó là vì 'Predef' được nhập tự động trong tất cả các ứng dụng Scala. Xem [dòng này] (https://github.com/scala/scala/blob/v2.10.0/src/library/scala/Predef.scala#L97) để biết Bản đồ có sẵn ở đâu. – overthink

+0

Rõ ràng điều quan trọng cần lưu ý là các loại bất biến được ưu tiên hơn các loại có thể thay đổi được, thực tế có một bản HashMap không thay đổi, vì vậy lý do thứ hai của bạn có thể quan trọng hơn. – thSoft

0

Nó có lẽ đã làm với hệ thống cấp bậc của lớp bộ sưu tập này:

enter image description here

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