4

例如,如果我这样做

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 等价物是什么?

4

1 回答 1

11
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清单中获得已擦除的类型。

于 2011-08-20T18:32:00.360 回答