相关疑难解决方法(0)

scala的ClassTag和TypeTag之间的区别

根据scala doc,TypeTag包含的信息比ClassTag更多.在我看来,TypeTag可以比ClassTag做更多的事情,比如将编译时的类型参数信息带到运行时等.

但是,以下示例显示ClassTag可以完成工作,而TypeTag则不能.我想了解原因.

import scala.reflect.ClassTag
import scala.reflect.runtime.universe.TypeTag
// def func[T](o: Any): Unit = {
// def func[T : TypeTag](o: Any): Unit = {
def func[T : ClassTag](o: Any): Unit = {
  o match {
    case x: T => println(Some(x))
    case _ => println(None)
  }spark
}
func[Map[Int, Int]](List(1, 2, 3))
Run Code Online (Sandbox Code Playgroud)

只有ClassTag会引导模式匹配None(这是预期的行为),前两个注释行将提出Some分支.

似乎ClassType可以在运行时反映对象的类型,而Type Tag则不能.但TypeTag不是ClassTag的超集吗?我想尽可能详细地了解解释.谢谢.

reflection scala

10
推荐指数
1
解决办法
3508
查看次数

为什么TypeTag没有方法runtimeClass但Manifest和ClassTag没有

我有这个代码一般将String转换为Dto,如果我使用Manifest和ClassTag,我可以使用方法runtimeClass来获取运行时类,但是TypeTag没有这个方法

class ObjectMapper[T] {

  def readValue(x: String, t: Class[T]): T = ???
}

class Reader {
  def read[W: Manifest](x: String): W = {
    val mapper = new ObjectMapper[W]
    mapper.readValue(x, implicitly[Manifest[W]].runtimeClass.asInstanceOf[Class[W]])
  }

}
Run Code Online (Sandbox Code Playgroud)

我可以知道为什么TypeTag没有方法runtimeClass

提前谢谢了

scala

5
推荐指数
1
解决办法
967
查看次数

标签 统计

scala ×2

reflection ×1