Scala相当于Java java.lang.Class <T> Object

Kek*_*koa 181 java scala class

最好通过一个例子来解释这个问题:

在Java中,对于JPA EntityManager,我可以执行以下操作(Account是我的Entity类):

Account result = manager.find(Account.class, primaryKey);
Run Code Online (Sandbox Code Playgroud)

在Scala中,我天真的尝试是:

val result = manager.find(Account.class, primaryKey)
Run Code Online (Sandbox Code Playgroud)

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

Von*_*onC 260

根据" 斯卡拉类型系统 ",

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>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这就是为什么以下不起作用的原因:

val xClass: Class[X] = new X().getClass //it returns Class[_], nor Class[X]

val integerClass: Class[Integer] = new Integer(5).getClass //similar error
Run Code Online (Sandbox Code Playgroud)

一张关于返回类型的票getClass.

(詹姆斯·摩尔报道说,这张票是"现在",即两年后的2011年11月,修正了.
在2.9.1中,getClass现在:

scala> "foo".getClass 
       res0: java.lang.Class[_ <: java.lang.String] = class java.lang.String
Run Code Online (Sandbox Code Playgroud)

)

早在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
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,提到的@VonC票据已在12月/ 11月11日标记为固定.在2.9.1中,getClass现在执行:scala>"foo".getClass res0:java.lang.Class [_ <:java.lang.String] = class java.lang.String (4认同)

Jon*_*ehl 49

classOf[Account]在Scala中等同Account.class于Java.