例如,如果我这样做
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
获得已删除的类型。从 list 。
关于scala - C++ typeid 的 Scala 等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7133768/