0

我最近发现 scala 反射库似乎已经停止维护并且与其他一些功能的交互很差,例如对于最简单的用例,当需要提取变量的类型时,scala 反射无法正确处理:

class InferTypeTag extends AnyFunSpec {

  import InferTypeTag._

  it("error case") {

    val x1: String = "A"

    val x2: x1.type = x1

    type T3 = x1.type
    val x3: T3 = x1

    val t1 = inferWeak(x1)
    val t2 = inferWeak(x2)
    val t3 = inferWeak(x3)

    println(
      s"$t1\n$t2\n$t3"
    )
  }
}

object InferTypeTag {


  def inferWeak[T](v: T)(implicit ev: WeakTypeTag[T]) = ev
}

在这里,您可以想象 x2 和 x3 被声明为 type x1.type,从 WeakTypeTag 检查的它们的编译时类型都应该与 x1 不同,x1 是 String 类型变量,是 的超类型x1.type。并且 x2 和 x3 的类型应该至少相等(定义在 =:= 中)。

主啊,这与现实相去甚远!运行上述测试时,这3种实际上是:

TypeTag[String]
TypeTag[String]
WeakTypeTag[T3]

所以 x1 和 x2 具有相同的声明类型?x3 在编译时不能有具体类型吗?这是怎么回事?

4

0 回答 0