tutorial objeto metodos listas instanciar genericos genericas ejemplos comentarios clases java class scala

metodos - objeto t en java



Equivalente en Scala del objeto Java java.lang.Class<T> (2)

La pregunta se explica mejor con un ejemplo:

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

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

En Scala, mi ingenuo intento es:

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

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


De acuerdo con " 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>

El classOf[T] devuelve la representación en tiempo de ejecución para un tipo de Scala. Es análogo a la expresión de 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, que reflejan el efecto del borrado de tipo 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 lo 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 getClass de getClass .

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

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

)

De vuelta en 2009:

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

Me dejaría hacer algo como lo siguiente en el que 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 utilizo Class [_ <: Foo]. Pero esto me impide pasar en una clase Foo usando Foo.getClass () sin un molde.

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


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