如何同时获取ClassTag表单TypeTag或两者?

时间:2013-09-10 21:48:46

标签: scala reflection scala-2.10 context-bound

我有一些像这样的代码:

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

最后一行失败了:

  

没有ClassTag可用于T

我认为TypeTagClassTag更多信息?我可以从ClassTag获取TypeTag吗?如果没有,是否有一些语法可以说T有两个上下文边界 - TypeTagClassTag?或者,您将如何修复此代码?

2 个答案:

答案 0 :(得分:31)

该库不提供直接将TypeTag转换为ClassTag的内置方法,但您可以编写一个:

import reflect.runtime.universe._
import reflect.ClassTag

def typeToClassTag[T: TypeTag]: ClassTag[T] = {
  ClassTag[T]( typeTag[T].mirror.runtimeClass( typeTag[T].tpe ) )
}

然后在您的方法中,只需在需要隐式ClassTag之前添加:

implicit val c = typeToClassTag[T]

答案 1 :(得分:18)

如果你正在追求的话,scala确实支持多个上下文界限:

class ReflectiveJsonFormat[T:TypeTag:ClassTag]