2016-05-23 2 views
4

В Scala, карта и набор литералов могут быть созданы с помощью, например,Каков фактический класс (а не абстрактный, а не признак) для карты и набора?

val m = Map(1->"a") 

и тип ссылки m и буквальное как Map[Int, String].

Однако Scala документы показывают, что Map на самом деле является признак, с абстрактными членами, которые должны быть выполнены для того, чтобы создать экземпляр: scala.collection.Map, scala.collection.immutable.Map, scala.collection.mutable.Map

Так что мой вопрос: что является фактическим , конкретный класс, на котором основан литерал Map? Тот же вопрос выше применим и к Set.

ответ

7

Вы можете найти конкретный класс выполнения с getClass:

scala> println(m.getClass) 
class scala.collection.immutable.Map$Map1 

Так что Map1, класс определяется внутри объекта Map компаньона. Но затем мы пытаемся сделать одно и то же на немного более крупной карте:

scala> val m2 = Map(1 -> "a", 2 -> "b") 
m2: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b) 

scala> println(m2.getClass) 
class scala.collection.immutable.Map$Map2 

Это другой класс. Попробуем карту с большим количеством элементов:

scala> println((0 to 10).map(i => i -> i.toString).toMap.getClass) 
class scala.collection.immutable.HashMap$HashTrieMap 

Это еще один класс.

Короче говоря, конкретный класс выполнения, который вы получаете от Map(...) или toMap является деталью реализации и подавляющее большинство времени вы не должны беспокоиться об этом (но когда вы делаете, вы можете проверить с getClass) ,

+0

Очень проницательный! Большое спасибо за ответ. У вас есть рекомендации по книгам, которые описывают Scala для таких деталей? –

Смежные вопросы