Какой тип возврата toSet в Scala - PullRequest
0 голосов
/ 16 июня 2020

Предположим, у меня есть Scala массив arr из Int. Рассмотрим arr.toSet. Я знаю, что toSet возвращает объект Set. Это Set a HashSet или TreeSet по умолчанию?

Ответы [ 3 ]

4 голосов
/ 16 июня 2020

Время компиляции тип значения, возвращаемого toSet, равно Set

def toSet[B >: A]: immutable.Set[B]

, однако время выполнения класс объекта, возвращаемого toSet может отличаться, что мы можем проверить, используя Scala REPL

Array(1).toSet.getClass                 // class immutable.Set$Set1
Array(1, 2).toSet.getClass              // class immutable.Set$Set2
Array(1, 2, 3).toSet.getClass           // class immutable.Set$Set3
Array(1, 2, 3, 4).toSet.getClass        // class immutable.Set$Set4
Array(1, 2, 3, 4, 5).toSet.getClass     // class immutable.HashSet
Array(1, 2, 3, 4, 5, 6).toSet.getClass  // class immutable.HashSet
...

, который выводит

1 голос
/ 16 июня 2020

Предположим, у меня есть Scala массив arr из Int. Рассмотрим arr.toSet. Я знаю, что toSet возвращает объект Set. Это Set a HashSet или TreeSet по умолчанию?

Ни то, ни другое. Это scala.collection.immutable.Set.

Вот :A]:scala.collection.immutable.Set[B]" rel="nofollow noreferrer"> документация для scala.Array.toSet (что на самом деле :A]:scala.collection.immutable.Set[B]" rel="nofollow noreferrer">scala.collection.IterableOnceOps.toSet):

def toSet[B >: A]: Set[B]

Как видите, здесь четко указано, что тип возврата - Set.

1 голос
/ 16 июня 2020

https://github.com/scala/scala/blob/2.13.x/src/library/scala/collection/immutable/Set.scala

До 4 элементов EmptySet, Set1, ..., Set4 (например, кортежи), затем HashSet.

...