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

Rob*_*b N 22 reflection scala context-bound scala-2.10

我有一些像这样的代码:

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)
  }
}
Run Code Online (Sandbox Code Playgroud)

最后一行失败了:

没有ClassTag可用于T

我以为TypeTag是比一个更多的信息ClassTag?我能得到ClassTagTypeTag?如果没有,是否有一些语法可以说T有两个上下文边界 - 两个TypeTagClassTag?或者,您将如何修复此代码?

gou*_*ama 34

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

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

def typeToClassTag[T: TypeTag]: ClassTag[T] = {
  ClassTag[T]( typeTag[T].mirror.runtimeClass( typeTag[T].tpe ) )
}
Run Code Online (Sandbox Code Playgroud)

然后在你的方法中只需在隐含ClassTag需要之前添加:

implicit val c = typeToClassTag[T]
Run Code Online (Sandbox Code Playgroud)


Rég*_*les 18

scala确实支持多个上下文边界,如果这是你所追求的:

class ReflectiveJsonFormat[T:TypeTag:ClassTag] 
Run Code Online (Sandbox Code Playgroud)

  • 对于什么是值得的,我完全同意,但 OP 说“或两者同时”,正如我的回答所示,这实际上更容易实现(尽管存在冗余)。 (2认同)