【问题标题】:In Scala, why it is impossible to infer TypeTag from type alias or dependent type?在 Scala 中,为什么无法从类型别名或依赖类型推断 TypeTag?
【发布时间】:2020-04-29 17:01:36
【问题描述】:

我有一个简单的 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不是final和路径依赖的,为什么ctg可以推断成功?

【问题讨论】:

  • 看起来像一个错误,考虑到scala-reflect 的永久实验状态,这并不奇怪

标签: scala implicit scala-reflect


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 2014-02-04
  • 1970-01-01
  • 2023-03-08
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
相关资源
最近更新 更多