scala - ¿Cómo obtener ClassTag formulario TypeTag, o ambos al mismo tiempo?
reflection scala-2.10 (2)
Bueno, scala sí admite múltiples límites de contexto si eso es lo que buscas:
class ReflectiveJsonFormat[T:TypeTag:ClassTag]
Tengo un código como este:
class ReflectiveJsonFormat[T:TypeTag] extends JsonFormat[T] {
def write(x: T) : JsValue = {
val t = typeOf[T]
val getters = t.declarations.filter { s => s.isMethod && s.asMethod.isGetter }
val mirror = runtimeMirror(this.getClass.getClassLoader)
val instanceMiror = mirror.reflect(x)
}
}
Esa última línea falla con:
No ClassTag disponible para T
Pensé que TypeTag
era más información que ClassTag
. ¿Puedo obtener el ClassTag
del TypeTag
? Si no, ¿hay alguna sintaxis para decir que T
tiene dos límites de contexto, tanto TypeTag
como ClassTag
? O bien, ¿cómo podrías corregir este código?
La biblioteca no proporciona un método integrado que convierte directamente un TypeTag
a ClassTag
, pero puede escribir uno:
import reflect.runtime.universe._
import reflect.ClassTag
def typeToClassTag[T: TypeTag]: ClassTag[T] = {
ClassTag[T]( typeTag[T].mirror.runtimeClass( typeTag[T].tpe ) )
}
Luego, en su método solo agregue antes de que se necesite el ClassTag
implícito:
implicit val c = typeToClassTag[T]