根据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的超集吗?我想尽可能详细地了解解释.谢谢.