Если вам просто нужен комплект, задайте 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
.
Я не вижу, чего вам не хватает. Для чего вы использовали этот класс? Где бы вы положили его в «структуру»? – Bergi
Я думаю, что результат типа объекта Set.apply неоднозначен. результат объекта Set.apply имеет тип Trait Set, а интерпретатор scala говорит, что у него есть тип Trait Set, но какой класс у него действительно есть? Я знаю, что Scala Trait совсем не похож на интерфейс java, но я не думаю, что сама черта может быть классом, хотя я ошибаюсь? – user3293793
Черты похожи на интерфейсы Java ... это только то, что они более универсальны. –