scala> val a = Set(1,2,3)
a: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
scala> a.getClass.getName
res0: java.lang.String = scala.collection.immutable.Set$Set3
(Да, это действительно экземпляр внутреннего класса с именем Set3
- это набор, специализированный для 3 элементов. Если вы сделаете его немного больше, это будет HashTrieSet
.)
Редактировать: @pst также указал, что информация о типе [Int]
была стерта;Вот как работают дженерики JVM.Однако REPL отслеживает, так как компилятор все еще знает тип.Если вы хотите получить тип, который знает компилятор, вы можете
def manifester[A: ClassManifest](a: A) = implicitly[ClassManifest[A]]
и тогда вы получите что-то, чей toString
совпадает с тем, что сообщает REPL.Между ними вы получите столько информации о типах, сколько нужно иметь.Конечно, поскольку REPL уже делает это для вас, вам обычно не нужно это использовать.Но если по какой-то причине вы хотите, стертые типы доступны из .typeArguments
из манифеста.