Equivalente Scala di Java java.lang.Class Oggetto

La domanda è meglio spiegata da un esempio:

In Java per un EntityManager JPA, posso fare quanto segue (Account è la mia class Entity):

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

In Scala, il mio tentativo ingenuo è:

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

Ma quando provo ad usare Account.class in Scala, sembra che non piaccia. Come posso specificare l’object java.lang.Class per la class Account in Scala?

Secondo ” 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 

Il classOf[T] restituisce la rappresentazione runtime per un tipo Scala. È analogo all’espressione Java T.class .
L’uso di classOf[T] è comodo quando si ha un tipo di cui si desiderano informazioni, mentre getClass è utile per recuperare le stesse informazioni da un’istanza del tipo.

Tuttavia, classOf[T] e getClass restituiscono valori leggermente diversi, che riflettono l’effetto getClass dei tipi sulla JVM, nel caso di getClass.

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

Ecco perché il seguente non funzionerà :

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

C’è un ticket riguardante il tipo di ritorno di getClass .

( James Moore riporta che il biglietto è “ora”, cioè il novembre 2011, due anni dopo, riparato.
In 2.9.1, getClass ora fa:

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

)

Indietro nel 2009:

Sarebbe utile se Scala trattasse il ritorno da getClass () come java.lang.Class [T] forSome {val T: C} dove C è qualcosa come la cancellazione del tipo statico dell'espressione su cui getClass è chiamato

Mi permetterebbe di fare qualcosa di simile al seguente in cui voglio introspettarsi su una class, ma non dovrebbe avere bisogno di un'istanza di class.
Voglio anche limitare i tipi di classi che voglio introspettare, quindi uso Class [_ <: Foo]. Ma questo mi impedisce di passare in una classe Foo usando Foo.getClass () senza cast.

Nota: per quanto riguarda getClass , una ansible soluzione potrebbe essere:

 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] in Scala è equivalente a Account.class in Java.