2016-08-31 2 views
0

Существует много классов, которые наследуют набор признаков. HashSet, TreeSet и т. Д.Почему класс Set не существует в scala?

И есть объект (могу ли я назвать его компаньоном объекта признаков? Нет? В случае класса Set?) Набор и набор признаков.

Мне кажется, что просто добавить еще один класс «Установить» в этот список, кажется, очень легко понять структуру.

Есть ли какая-либо причина, что набор классов не должен существовать?

+0

Я не вижу, чего вам не хватает. Для чего вы использовали этот класс? Где бы вы положили его в «структуру»? – Bergi

+0

Я думаю, что результат типа объекта Set.apply неоднозначен. результат объекта Set.apply имеет тип Trait Set, а интерпретатор scala говорит, что у него есть тип Trait Set, но какой класс у него действительно есть? Я знаю, что Scala Trait совсем не похож на интерфейс java, но я не думаю, что сама черта может быть классом, хотя я ошибаюсь? – user3293793

+0

Черты похожи на интерфейсы Java ... это только то, что они более универсальны. –

ответ

1

В Scala нет совпадений между классами и чертами. Классы - это реализации, которые могут быть инстанцированы, в то время как признаки являются независимо смешиваемыми интерфейсами. Использование Set.apply дает объект с интерфейсом Set, и это все, что вам нужно знать, чтобы использовать его. Я полностью понимаю, что хочу конкретного типа, но это было бы лишним. Правильная вещь для этого - сохранить ее до значения типа Set и использовать только интерфейс Set.

Я знаю, что это может быть не удовлетворительным, но дайте ему время, и система типа Scala будет иметь смысл с точки зрения самого себя, даже если это отличается от того, что делает Java.

3

Если вам просто нужен комплект, задайте Set.apply для набора, и вы закончили и счастливы, у вас есть действующий набор, поддерживающий набор операций, который должен поддерживать, и не нужно беспокоиться о том, как оно реализовано. Он готов хорошо работать для большинства случаев.

С другой стороны, если для вас важны определенные операции, создайте конкретный класс для конкретной реализации набора, и вы точно узнаете, что у вас есть.

В Java можно было бы написать:

Set<String> strings = new HashSet<>(Arrays.asList("a", "b")); 

в Скале вы и могли бы иметь те типы

val strings: Set[String] = HashSet("a", "b") 

, но вы также можете использовать удобный завод, если вам не нужно беспокоиться о типа и просто используйте

val strings = Set("a", "b") 

и ничего не получается с этим, и я не вижу, как добавление другого класса помогли бы вообще. Нормально иметь интерфейс/черту и конкретные реализации, ничто в середине не нужно и не полезно для вас.

Set.apply является фабрикой для комплектов. Вы можете проверить, каков фактический класс результирующего объекта, используя getClass. Эта фабрика создает специальные, оптимизированные наборы для размеров 0-4, например

scala.collection.immutable.Set$EmptySet$ 
scala.collection.immutable.Set$Set1 
scala.collection.immutable.Set$Set2 

для больших наборов является хэш-набор, а именно scala.collection.immutable.HashSet$HashTrieSet.

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