2013-02-12 15 views
5

Jeśli używamy map wtedy nie ma potrzeby importowania niezmienne mapDlaczego Scala Map jest automatycznie importowana, ale HashMap nie jest?

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

Ale jeśli używamy HashMap, a następnie, nie robiąc importu, daje błąd.

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

ale robi import scala.collection.immutable.HashMap, to działa.

ja też to widzę z zestawu i Hashset ..

Zauważyłem jedną rzecz, że mapa i mieszczą się cecha i HashSet, HashMap są zajęcia.

Więc dlaczego tak jest?

EDIT

Klasa stosu i kolejki jest także występować w pakiecie scala.collection. dlaczego musimy importować te klasy. ???

+0

'' 'val map = mapa()' '' zrobi to samo, ponieważ mapa jest niezmienna. i '' '> map + (" Ahoy "-> 0)" '' działa, dzięki kowariancji. – jwinandy

+0

Co do Stack i Queue, myślę, że są one o wiele mniej używane niż List, Set i Map. –

+0

Nie jestem pewien, ale myślę, że są to klasy takie jak HashMap. dlatego nie są automatycznie importowane, ponieważ sugeruje odpowiedź "Program do interfejsu, a nie implementacja". – Rishi

Odpowiedz

3

To dlatego, że Predef jest niejawnie zaimportowane. Między innymi zawiera fabryczne metody wspólnych cech, takich jak Map. HashMap jest konkretną implementacją, więc jeśli używałeś jej metody fabrycznej z wnioskiem typu, ściśle powiązałeś deklarację z implementacją.

+0

Dlaczego mapa jest zarejestrowana w Predef, a HashMap nie? –

1

W Scala preferowanie typów niezmiennych jest idiotyczne, dlatego te są domyślnie dostępne. Jeśli chcesz mutacji, musisz to wyraźnie powiedzieć.

Kolejny potencjalny powód (a ja tylko zgaduję) to, że HashMap to Mapa, a w wielu przypadkach nie interesuje Cię, jaką konkretną implementację Map otrzymujesz, chcesz tylko coś, co może kojarzyć klucze z wartościami i dość szybko wyszukiwań. Bardziej abstrakcyjne jest więc mówienie "Mapa" ("foo" -> "bar") niż HasArrayMappedTrie ("foo" -> "bar").

+0

Ale jeśli spróbujemy użyć niezmiennej kolejki bez importowania scala.collection.immutable.Queue, to nie zadziała. podczas gdy zarówno mapa, jak i kolejka znajdują się w pakiecie scala.collection. Dlaczego tak jest? – Rishi

+1

Jak mówi poniżej ThSoft, dzieje się tak dlatego, że 'Predef' jest auomatycznie importowany we wszystkich aplikacjach Scala. Zobacz [ta linia] (https://github.com/scala/scala/blob/v2.10.0/src/library/scala/Predef.scala#L97), gdzie udostępniono Mapę. – overthink

+0

Mimo to należy zauważyć, że typy niezmienne są preferowane w porównaniu z niezmiennymi, w rzeczywistości jest to niezmienna implementacja HashMap, więc twój drugi powód może być bardziej znaczący. – thSoft

0

Prawdopodobnie ma to związek z hierarchią tej klasy kolekcji:

enter image description here

Powiązane problemy