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?
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 JavaT.class
.
UsarclassOf[T]
es conveniente cuando tiene un tipo sobre el que desea información, mientras quegetClass
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
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.
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