【问题标题】:Why function scala.reflect.runtime.universe.classTag[T] is missing?为什么缺少函数 scala.reflect.runtime.universe.classTag[T]?
【发布时间】:2015-01-22 08:07:26
【问题描述】:

我正在使用 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

非常感谢!

【问题讨论】:

    标签: scala reflection


    【解决方案1】:

    scala.reflectpackage

    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相同。如果你想从ClassTag获取TypeTag,类型未擦除:

    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
    

    【讨论】:

    • 非常感谢!我可以再问一个问题吗?运算符 <: scala.reflect.runtime.universe.typetag classtag>
    • 知道了:classOf[Map[,]].isAssignableFrom(classTag[T].runtimeClass) 函数名太奇怪了,我几乎没有读过它而不认为它没用
    • 我很想用scala方式,可惜Spark RDD不让我:它不提供TypeTag,可能是由于遗留代码迁移
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    相关资源
    最近更新 更多