Geo*_*ing 4 reflection scala typeid
例如,如果我这样做
scala> val a = Set(1,2,3)
a: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
在REPL中,我希望看到最精致的"a"类型,以便知道它是否真的是一个HashSet.在C++中,typeid(a).name()会这样做.什么是Scala等价物?
Rex*_*err 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
Run Code Online (Sandbox Code Playgroud)
(是的,它确实是一个内部类的实例,名为Set3
--it是一个专门用于3个元素的集合.如果你把它设置得更大,那么它就是一个HashTrieSet
.)
编辑:@pst还指出类型信息[Int]
已被删除; 这就是JVM泛型的工作原理.但是,REPL会保持跟踪,因为编译器仍然知道类型.如果你想获得编译器知道的类型,你可以
def manifester[A: ClassManifest](a: A) = implicitly[ClassManifest[A]]
Run Code Online (Sandbox Code Playgroud)
然后你会得到一些toString
与REPL报告相同的东西.在这两者之间,您将获得尽可能多的类型信息.当然,既然REPL已经为你做了这个,你通常不需要使用它.但如果出于某种原因,您可以从.typeArguments
清单中获取已删除的类型.
归档时间: |
|
查看次数: |
183 次 |
最近记录: |