scala reflection scala-2.10 context-bound

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]