繁体   English   中英

相当于Java java.lang.Class的Scala <T> 宾语

[英]Scala equivalent of Java java.lang.Class<T> Object

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

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

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

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

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

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

根据“ 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可以从类型的实例中检索相同的信息,因此非常方便。

但是,对于getClassclassOf[T]getClass返回的值略有不同,反映了类型擦除对JVM的影响。

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

早在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

Scala中的classOf[Account]等效于Java中的Account.class

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM