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.