我有一个简单的scala程序来测试Scala推断类型类的能力:
import scala.reflect.ClassTag
object InferTypeTag {
import org.apache.spark.sql.catalyst.ScalaReflection.universe._
def infer(): Unit = {
type U = (Int, String)
val ttg1 = implicitly[TypeTag[(Int, String)]]
val ttg2 = implicitly[TypeTag[U]]
val ctg = implicitly[ClassTag[U]]
}
}
ttg1
毫无疑问地推断出来。
ttg2
触发了以下编译错误:
Error:(14, 26) No TypeTag available for U
val ttg2 = implicitly[TypeTag[U]]
问题1:为什么它不起作用?类型U已经是最终的,无法覆盖
问题2:如果类型U不是最终的并且与路径相关,为什么可以成功推断ctg?
TypeTags
是在编译时生成的,但是您的类型声明在运行时的函数体内。尝试像这样将声明移到函数体之外]
object InferTypeTag {
type U = (Int, String)
def infer(): Unit = {
...
val ttg2 = implicitly[TypeTag[U]]
...
}
}