Scala classOf pour le paramètre type

J’essaie de créer une méthode générique pour les mises à jour d’object en utilisant scala / java mais je ne peux pas obtenir la classe pour un paramètre de type.

Voici mon code:

object WorkUnitController extends Controller { def updateObject[T](toUpdate: T, body: JsonObject){ val source = gson.fromJson(body, classOf[T]); ... } } 

L’erreur que je reçois est

type de classe requirejs mais T trouvé

Je sais qu’en Java, vous ne pouvez pas le faire, mais est-ce possible en scala?

Merci!

Due Manifest est obsolète (depuis Scala 2.10.0) il s’agit de la réponse mise à jour –

 import scala.reflect.ClassTag import scala.reflect._ object WorkUnitController extends Controller { def updateObject[T: ClassTag](toUpdate: T, body: JsonObject){ val source = gson.fromJson(body, classTag[T].runtimeClass) ??? } } 

Vous devez utiliser ClassTag au lieu de ClassManifest et .runtimeClass au lieu de .erasure

Réponse originale – Oui, vous pouvez le faire en utilisant les manifestes:

 object WorkUnitController extends Controller { def updateObject[T: ClassManifest](toUpdate: T, body: JsonObject){ val source = gson.fromJson(body, classManifest[T].erasure); ... } } 

La réponse de Vasil et Maxim m’a aidé.

Personnellement, je préfère la syntaxe où implicit est utilisé pour append de tels parameters (le présenté : ClassTag est un raccourci pour cela. Donc, ici, si quelqu’un d’autre voit cela comme une meilleure façon:

 import scala.reflect.ClassTag object WorkUnitController extends Controller { def updateObject[T](toUpdate: T, body: JsonObject)(implicit tag: ClassTag[T]){ val source = gson.fromJson(body, tag.runtimeClass) ??? } } 

Disclaimer: Je n’ai pas compilé ce qui précède, mais mon propre code similaire fonctionne de cette façon.