一尘不染

与Java java.lang.Class <T>对象对应的Scala

java

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

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

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

在Scala中,我的幼稚尝试是:

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

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


阅读 390

收藏
2020-03-19

共1个答案

一尘不染

根据“ 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

2020-03-19