tutorial software renault fungicida examples constructora blanquerna scala

software - Scala classOf para el parámetro de tipo



scala tutorial (2)

Intento crear un método genérico para las actualizaciones de objetos utilizando scala / java, pero no puedo obtener la clase para un parámetro de tipo.

Aquí está mi código:

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

El error que recibo es

tipo de clase requerida pero T encontró

Sé que en Java no puedes hacerlo, pero ¿es posible esto en Scala?

¡Gracias!


Due Manifest está en desuso (Desde Scala 2.10.0) esta es la respuesta actualizada -

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) ??? } }

Debería usar ClassTag lugar de ClassManifest y .runtimeClass lugar de .erasure

Respuesta original: sí, puedes hacer eso usando manifiestos:

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


La respuesta de Vasil y Maxim me ayudó.

Personalmente, prefiero la sintaxis donde implicit se usa para agregar dichos parámetros (el presentado : ClassTag es abreviado). Aquí, en caso de que alguien más también vea que es una mejor manera:

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) ??? } }

Descargo de responsabilidad: no compilé lo anterior, pero mi código similar funciona de esta manera.