Scala equivalente a Java java.lang.Objeto de Clase


La pregunta se explica mejor con un ejemplo:

En Java para un EntityManager de JPA, puedo hacer lo siguiente(La cuenta es mi clase de entidad):

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

En Scala, mi intento ingenuo es:

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

Pero cuando intento usar Account.class en Scala, parece que esto no me gusta. Cómo puedo especificar el java.lang.¿Objeto Class para la clase Account en Scala?

Author: Kekoa, 2009-07-16

2 answers

De acuerdo con " El Sistema de Tipos 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>

El método classOf[T] devuelve la representación en tiempo de ejecución para un tipo Scala. Es análogo a la expresión Java T.class.
Usar classOf[T] es conveniente cuando tiene un tipo sobre el que desea información, mientras que getClass es conveniente para recuperar la misma información de una instancia del tipo.

Sin embargo, classOf[T] y getClass devuelven valores ligeramente diferentes, reflejando el efecto del tipo borrado en la JVM, en el caso de getClass.

scala> classOf[C]
res0: java.lang.Class[C] = class C

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

Es por eso que el siguiente no funcionará :

val xClass: Class[X] = new X().getClass //it returns Class[_], nor Class[X]

val integerClass: Class[Integer] = new Integer(5).getClass //similar error

Hay un boleto con respecto al tipo de devolución de getClass.

(James Moore informa que el boleto es "ahora", es decir, Nov. 2011, dos años después, arreglado.
En 2.9.1, getClass ahora hace:

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

)

En 2009:

Sería útil si Scala tratara el retorno de getClass () como un Java.lang.Class [T] forSome { val T: C } donde C es algo así como la eliminación del tipo estático de la expresión en la que se llama getClass

Me permitiría hacer algo como lo siguiente donde quiero hacer introspección en una clase, pero no debería necesitar una instancia de clase.
También quiero limitar los tipos de clases en las que quiero hacer introspección, así que uso Class[_ <:>

Nota: con respecto a getClass, una posible solución sería:

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
 241
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:44

classOf[Account] en Scala es equivalente a Account.class en Java.

 44
Author: Jonathan Graehl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-26 00:35:53