Что такое Scala-эквивалент C ++ typeid? - PullRequest
4 голосов
/ 20 августа 2011

Например, если я сделаю

scala> val a = Set(1,2,3)
a: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

в REPL, я хочу увидеть наиболее усовершенствованный тип «a», чтобы узнать, действительно ли это HashSet. В C ++ typeid (a) .name () сделает это. Что такое эквивалент Scala?

1 Ответ

11 голосов
/ 20 августа 2011
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 из манифеста.

...