问题
I have some code like this:
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)
}
}
That last line fails with:
No ClassTag available for T
I thought TypeTag
was more info than a ClassTag
? Can I get the ClassTag
from the TypeTag
? If not, is there some syntax for saying that T
has two context bounds -- both TypeTag
and ClassTag
? Or, how would you otherwise fix this code?
回答1:
Well scala does support multiple context bounds if that is what you are after:
class ReflectiveJsonFormat[T:TypeTag:ClassTag]
回答2:
The library doesn't provide a built-in method that directly converts a TypeTag
to a ClassTag
, but you can write one:
import reflect.runtime.universe._
import reflect.ClassTag
def typeToClassTag[T: TypeTag]: ClassTag[T] = {
ClassTag[T]( typeTag[T].mirror.runtimeClass( typeTag[T].tpe ) )
}
Then in your method just add before the implicit ClassTag
is needed:
implicit val c = typeToClassTag[T]
来源:https://stackoverflow.com/questions/18729321/how-to-get-classtag-form-typetag-or-both-at-same-time