如何从TypeTag中获取ClassTag,还是同时生成?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (22)

我有这样的代码:

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

我认为TypeTag比一个更多的信息ClassTag?我可以ClassTag从中获得TypeTag?如果没有,是否有一些说法T有两个上下文边界的语法- 两者TypeTagClassTag?或者,你会如何解决这个问题?

提问于
用户回答回答于

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

class ReflectiveJsonFormat[T:TypeTag:ClassTag] 
用户回答回答于

该库不提供直接转换一个内置的方法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]

扫码关注云+社区