在scala中,如何真实地获取变量的声明类型?

问题描述

我最近发现 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 被声明为 x1.type 类型,从 WeakTypeTag 检查它们的编译时类型应该都不同于 x1,它是一个 String 类型变量,一个超级x1.type 的类型。并且 x2 和 x3 的类型至少应该相等(如 =:= 中所定义)。

天哪,这与现实相去甚远!运行上述测试时,3种类型实际上是:

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

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)