根据“
The Scala Type System
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
.
使用
类别[T]
getClass
便于从类型的实例检索相同的信息。
类别[T]
和
getClass
在getClass的情况下,返回稍有不同的值,反映类型擦除对JVM的影响。
scala> classOf[C]
res0: java.lang.Class[C] = class C
scala> c.getClass
res1: java.lang.Class[_] = class C
这就是为什么
following will not work
val xClass: Class[X] = new X().getClass //it returns Class[_], nor Class[X]
val integerClass: Class[Integer] = new Integer(5).getClass //similar error
有一个
ticket regarding the return type of
getClass
.
James Moore
报道称,这张票是“现在”的,即两年后的2011年11月,已确定。
getClass
现在有:
scala> "foo".getClass
res0: java.lang.Class[_ <: java.lang.String] = class java.lang.String
回到2009年:
它可以让我像下面这样做,我想对一个类进行内省,但不需要类实例。
我还想限制我想要内省的类的类型,所以我使用Class[\ult;: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