微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在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 举报,一经查实,本站将立刻删除。