斯卡拉等价的Java java.lang.Class的 宾语 斯卡拉等价的Java java.

2019-06-14 15:27发布

现在的问题是最好的例子来说明:

在Java中的JPA EntityManager的,我可以做以下(帐户是我实体类):

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

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

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

但是,当我尝试使用Account.class在Scala中,它似乎不喜欢这样。 我怎么可以指定在斯卡拉账户类的java.lang.Class对象?

Answer 1:

据“ 斯卡拉型系统 ”,

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

( 詹姆斯·穆尔报道说,票是“现在”,即2011十一月,两年后,固定。
在2.9.1 getClass现在这样:

scala> "foo".getClass 
       res0: java.lang.Class[_ <: java.lang.String] = class java.lang.String

早在2009年:

{:C VAL T】其中,C是一样的东西的静态类型表达的擦除在其上的getClass是如果Scala的是治疗患有的getClass(),为的java.lang.Class [T] forSome返回将是有用叫

这将让我做这样的事情,我要反思的一类,但不应该需要一个类实例如下。
我还希望限制类型的我想内省类上,所以使用类[_ <:美孚]。 但是,这使我从一个Foo类通过使用Foo.getClass()不进行强制转换。

注:有关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


Answer 2:

classOf[Account]斯卡拉相当于Account.class在Java中。



文章来源: Scala equivalent of Java java.lang.Class Object
标签: java class scala