代码之家  ›  专栏  ›  技术社区  ›  Kekoa

Scala相当于Java.lang.Class<T>对象

  •  175
  • Kekoa  · 技术社区  · 17 年前

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

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

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

    但是当我尝试使用 Account.class

    2 回复  |  直到 17 年前
        1
  •  269
  •   Community Mohan Dere    6 年前

    根据“ The Scala Type System

    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 .
    使用 类别[T] getClass 便于从类型的实例检索相同的信息。

    类别[T] getClass 在getClass的情况下,返回稍有不同的值,反映类型擦除对JVM的影响。

    scala> classOf[C]
    res0: java.lang.Class[C] = class C
    
    scala> c.getClass
    res1: java.lang.Class[_] = class C
    

    这就是为什么 following will not work

    val xClass: Class[X] = new X().getClass //it returns Class[_], nor Class[X]
    
    val integerClass: Class[Integer] = new Integer(5).getClass //similar error
    

    有一个 ticket regarding the return type of getClass .

    James Moore 报道称,这张票是“现在”的,即两年后的2011年11月,已确定。
    getClass 现在有:

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

    回到2009年:

    它可以让我像下面这样做,我想对一个类进行内省,但不需要类实例。
    我还想限制我想要内省的类的类型,所以我使用Class[\ult;: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
    
        2
  •  50
  •   Anubian Noob    10 年前

    classOf[Account] 在Scala中相当于 Account.class

    推荐文章