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

问题描述 投票:1回答:1

我有一个简单的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 implicit scala-reflect
1个回答
0
投票

TypeTags是在编译时生成的,但是您的类型声明在运行时的函数体内。尝试像这样将声明移到函数体之外]

object InferTypeTag {
  type U = (Int, String)

  def infer(): Unit = {
    ...
    val ttg2 = implicitly[TypeTag[U]]
    ...
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.