Scala等效于Java java.lang.Class 对象

问题:

这个问题最好由一个例子解释:
在Java for JPA EntityManager中,我可以执行以下操作(Account是我的Entity类):

Account result = manager.find(Account.class, primaryKey);

在斯卡拉,我天真的尝试是:

val result = manager.find(Account.class, primaryKey)

但是当我尝试在Scala中使用Account.class时,似乎不喜欢这样。如何在Scala中为Account类指定java.lang.Class对象?

回答:

根据“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
当您有一个需要信息的类型时,使用classOf[T]非常方便,而getClass便于从类型的实例中检索相同的信息。

然而,classOf[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月,两年后,固定。
在2.9.1中,getClass现在是:

scala> “foo”.getClass
res0: java.lang.Class[_ <: java.lang.String] = class java.lang.String [/code] 早在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 [/code]     Code问答: http://codewenda.com/topics/python/
Stackoverflow: Scala equivalent of Java java.lang.Class Object

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

94 − = 84