在 Scala 中,为什么无法从类型别名或依赖类型推断 TypeTag?



我有一个简单的 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可以成功推断?

也许有人会解释为什么本地类型看起来很抽象。也许只是一个错误。

scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._
scala> { type X = Tuple2[Int, String] ; weakTypeTag[X] }
res0: reflect.runtime.universe.WeakTypeTag[X] = WeakTypeTag[X]
scala> { type X = Tuple2[Int, String] ; typeTag[X] }
^
error: No TypeTag available for X
scala> { type X = Tuple2[Int, String] ; weakTypeTag[X].tpe }
res2: reflect.runtime.universe.Type = X

最新更新