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.