2011-08-20 87 views
4

例如,如果我在做REPL什么是C++ typeid的Scala等价物?

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

,我想看到的最精致型的“一”,才能知道它是否真的是一个HashSet的。在C++中,typeid(a).name()会做到这一点。什么是Scala等价物?

回答

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一个内部类的实例--IT是一套专门为3元。如果你把它稍微大一些,这将是一个HashTrieSet

编辑:@pst也指出,类型信息[Int]被删除;这就是JVM泛型的工作原理。但是,由于编译器仍然知道类型,所以REPL保持跟踪。如果你想获得编译器知道类型,你可以

def manifester[A: ClassManifest](a: A) = implicitly[ClassManifest[A]] 

,然后你会得到的东西,其toString相同什么REPL报告。在这两者之间,你将获得尽可能多的类型信息。当然,由于REPL已经为你做了这个,你通常不需要使用它。但如果出于某种原因,清单中的.typeArguments可以使用擦除类型。

相关问题