scala - C++ typeid 的 Scala 等价物是什么?

标签 scala reflection typeid

例如,如果我这样做

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/

相关文章:

scala - 通过 joda DateTime 范围 scala/casbah 查找 mongodb 条目

eclipse - 如何使用 sbt 和 sbt-osgi 构建 eclipse 插件?

c# - 为什么我的 C# IS 语句不起作用?

c# - 是否有任何 .net 语言公开 'methodof' 或 'fieldof'

c++ - 如何将类型的名称作为字符串嵌入到 static_assert() 中?

c++ - 您可以使用类型信息查找类型吗?

scala - Lift Web 框架的开源应用程序

scala - Scala 库是否遵循与 Java 相同的反向域约定命名包?

java - 如何使用反射调用接受Map作为输入参数的私有(private)方法?

c++ - 容器 STL 的 typeid