2021年1月27日星期三

In scala, how to authentically get the declared type of a variable?

I recently found that the scala reflection library seems to be out of maintenance and interact poorly with a few other features, e.g. For the most simple use case, when the types of variables needs to be extracted, scala reflection can't get it right:

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  }    

Here, you would imagine that x2 and x3 are declared to be of type x1.type, their compile-time type inspected from WeakTypeTag should both be different from that of x1, which is a String type variable, a super type of x1.type. And type of x2 and x3 should be at least equal (as defined in =:=).

Lord how it is far from reality! When running the above test, the 3 types are actually:

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

So x1 and x2 have the same declared type? And x3 can't have a concrete type at compile-time? What is going here?

https://stackoverflow.com/questions/65930055/in-scala-how-to-authentically-get-the-declared-type-of-a-variable January 28, 2021 at 10:08AM

没有评论:

发表评论