我正在使用apache Spark,我的一个子程序是检查RDD [T:ClassTag]的T:ClassTag是否是Map的子类。
我已经检查了许多关于scala反射的来源,他们都建议使用以下代码:
import scala.reflect.runtime.universe._
if classTag[T] <:< classTag[Map[_,_]] {do something...}
然而classTag函数似乎缺失了,我只看到typeOf和weakTypeOf,这显然在这里不起作用(因为类型擦除:RDD的ClassTag携带的信息远少于TypeTag)。它是否在后来的scala版本中移动到其他地方?我正在使用2.10.4
非常感谢!
答案 0 :(得分:1)
它在scala.reflect
包
scala> import scala.reflect._
import scala.reflect._
scala> classTag[Option[Int]]
res45: scala.reflect.ClassTag[Option[Int]] = scala.Option
查看最现代的documentation
对于子类型检查,你应该使用typeTag,如:
import scala.reflect.runtime.universe._
scala> typeTag[Int].tpe <:< typeTag[Any].tpe
res54: Boolean = true
scala> typeTag[Int].tpe <:< typeTag[Boolean].tpe
res55: Boolean = false
您可以使用与TypeTag
相同的方式获取ClassTag
。如果您想从TypeTag
获取ClassTag
未选择的类型:
scala> def getTypeTag[T: TypeTag](ct: ClassTag[T]) = typeTag[T]
getTypeTag: [T](ct: scala.reflect.ClassTag[T])(implicit evidence$1: reflect.runtime.universe.TypeTag[T])reflect.runtime.universe.TypeTag[T]
scala> getTypeTag(classTag[Int])
res52: reflect.runtime.universe.TypeTag[Int] = TypeTag[Int]
如果您只需要检查两种已知类型之间的子类型:
scala> typeOf[Int] <:< typeOf[Boolean]
res56: Boolean = false