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