2013-02-12 9 views
5

Wenn wir Karte verwenden, dann keine Notwendigkeit zu importieren unveränderlich KarteWarum wird Scala Map automatisch importiert, aber HashMap nicht?

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

Aber wenn wir HashMap verwenden, dann ohne Import zu tun, gibt es Fehler.

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

aber tun import scala.collection.immutable.HashMap, es funktioniert.

Ich sehe es auch mit Set und Hashset ..

ich eine Sache feststellen, dass Karte und Set sind Zug und HashSet, HashMap sind Klassen.

Also warum ist es so ???

EDIT

Klasse Stack und Queue auch in scala.collection Paket vorhanden ist. Warum müssen wir diese Klassen importieren? ???

+0

'' 'val map = Karte()' '' würde das gleiche tun, da Karte unveränderlich ist. und '' '> map + (" Ahoy "-> 0)' '' funktioniert, dank der Kovarianz. – jwinandy

+0

Wie für Stack und Warteschlange, ich denke, dass sie nur viel weniger verwendet als List, Set und Map. –

+0

Ich bin mir nicht sicher, aber ich denke, das sind die Klassen wie HashMap. Daher werden sie nicht automatisch importiert, da Ihre Antwort "Programm an eine Schnittstelle, keine Implementierung" suggeriert. – Rishi

Antwort

3

Es ist, weil Predef implizit importiert wird. Unter anderem enthält es Factory-Methoden für gemeinsame Merkmale wie Map. HashMap ist eine konkrete Implementierung. Wenn Sie also die Factory-Methode mit Typinferenz verwenden, würden Sie Ihre Deklaration eng an eine Implementierung koppeln.

+0

Warum wird Map in Predef eingetragen, während HashMap nicht? –

1

In Scala ist es idiomatisch, unveränderliche Typen zu bevorzugen, daher werden diese standardmäßig zur Verfügung gestellt. Wenn Sie eine Mutation wollen, müssen Sie dies ausdrücklich sagen. Ein weiterer möglicher Grund (und ich rate nur) ist, dass HashMap eine Karte ist, und in vielen Fällen ist es Ihnen egal, welche konkrete Implementierung von Map Sie bekommen, Sie wollen nur etwas, das Schlüssel zuordnen kann mit Werten und haben ziemlich schnelle Lookups. Es ist also abstrakter, nur Map ("foo" -> "bar") als HasArrayMappedTrie ("foo" -> "bar") zu sagen.

+0

Aber wenn wir versuchen werden, unveränderliche Warteschlange zu verwenden, ohne scala.collection.immutable.Queue zu importieren, dann funktioniert es nicht. während sich Map und Queue im scala.collection-Paket befinden. Wieso ist es so ?? – Rishi

+1

Wie ThSoft unten sagt, liegt das daran, dass 'Predef' in allen Scala-Apps automatisch importiert wird. In [diese Zeile] (https://github.com/scala/scala/blob/v2.10.0/src/library/scala/Predef.scala#L97) finden Sie, wo Map verfügbar gemacht wird. – overthink

+0

Obwohl es wichtig ist, zu beachten, dass unveränderliche Typen gegenüber änderbaren Typen bevorzugt werden, gibt es tatsächlich eine unveränderliche Implementierung von HashMap, daher könnte der zweite Grund signifikanter sein. – thSoft

0

Es hat wahrscheinlich mit der Hierarchie dieser Sammlung Klasse zu tun:

enter image description here

Verwandte Themen