为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕尼黑5688855 2019-10-16 15:01:09
这个问题最好用一个例子来解释:在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对象?
查看完整描述

2 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

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


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


查看完整回答
反对 回复 2019-10-16
  • 2 回答
  • 0 关注
  • 593 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信