我最近发现 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 在编译时不能有具体类型吗?这是怎么回事?