根据“ Scala类型系统 ”,
val c = new C
val clazz = c.getClass // method from java.lang.Object
val clazz2 = classOf[C] // Scala method: classOf[C] ~ C.class
val methods = clazz.getMethods // method from java.lang.Class<T>
该classOf[T]
方法返回Scala类型的运行时表示形式。它类似于Java表达式T.class
。
使用classOf[T]
非常方便,当你有一个类型,你想了解的信息,同时getClass
便于检索从类型的实例相同的信息。
然而,classOf[T]
并getClass
返回略微不同的值,反映了类型擦除在JVM上的效果,在的getClass的情况下。
scala> classOf[C]
res0: java.lang.Class[C] = class C
scala> c.getClass
res1: java.lang.Class[_] = class C
这就是为什么以下方法不起作用的原因:
val xClass: Class[X] = new X().getClass //it returns Class[_], nor Class[X]
val integerClass: Class[Integer] = new Integer(5).getClass //similar error
有一张关于的回程类型的票证getClass
。
(James Moore报告说该票是“现在”的,即两年后的2011年11月,已修复。
在2.9.1中,getClass
现在执行:
scala> "foo".getClass
res0: java.lang.Class[_ <: java.lang.String] = class java.lang.String
)
早在2009年:
如果Scala将getClass()的返回值当作java.lang.Class [T] forSome {val T:C}对待,其中C类似于删除getClass所在的表达式的静态类型叫
它可以让我在想要对一个类进行内省但不需要类实例的情况下执行以下操作。
我也想限制我要反思的类的类型,所以我使用Class [_ <:Foo]。但这阻止了我在不进行强制转换的情况下使用Foo.getClass()来传递Foo类。
注意:关于getClass
,可能的解决方法是:
class NiceObject[T <: AnyRef](x : T) {
def niceClass : Class[_ <: T] = x.getClass.asInstanceOf[Class[T]]
}
implicit def toNiceObject[T <: AnyRef](x : T) = new NiceObject(x)
scala> "Hello world".niceClass
res11: java.lang.Class[_ <: java.lang.String] = class java.lang.String