例如,如果我这样做
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 等价物是什么?
例如,如果我这样做
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 等价物是什么?
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
清单中获得已擦除的类型。