Scala:为类内部的内部类型生成的TypeTag不';t匹配它';s型
如果类包含一个内部类和一个Scala:为类内部的内部类型生成的TypeTag不';t匹配它';s型,scala,reflection,inner-classes,Scala,Reflection,Inner Classes,如果类包含一个内部类和一个TypeTag,因为它是在该类内部生成的,则生成的TypeTag将包含“相对于容器”的内部类型,并且与TypeTag的泛型类型参数不匹配。例如: scala> import scala.reflect.runtime.{universe => ru} scala> class A { class B; val t = ru.typeTag[B] } scala> val x = new A scala> x.t res0: reflect.
TypeTag
,因为它是在该类内部生成的,则生成的TypeTag
将包含“相对于容器”的内部类型,并且与TypeTag
的泛型类型参数不匹配。例如:
scala> import scala.reflect.runtime.{universe => ru}
scala> class A { class B; val t = ru.typeTag[B] }
scala> val x = new A
scala> x.t
res0: reflect.runtime.universe.TypeTag[x.B] = TypeTag[A.this.B]
这里的x.t
是一个TypeTag[x.B]
但实际上包含另一个类型:a.this.B
。问题在于,虽然A
的每个实例的内部类型都不同,但TypeTag
中的类型保持不变:
scala> val y = new A
scala> y.t
res1: reflect.runtime.universe.TypeTag[y.B] = TypeTag[A.this.B]
scala> x.t.tpe =:= y.t.tpe
res2: Boolean = true
scala> ru.typeOf[x.B] =:= ru.typeOf[y.B]
res3: Boolean = false
这种行为是出于设计目的,还是可以在以后的版本(我的版本是2.11.7)中解决此问题
此问题的一个解决方法是在容器类外部生成TypeTag
:
scala> def tt(a: A)(implicit t: ru.TypeTag[a.B]) = t
scala> tt(x)
res6: reflect.runtime.universe.TypeTag[x.B] = TypeTag[x.B]
scala> tt(y)
res7: reflect.runtime.universe.TypeTag[y.B] = TypeTag[y.B]
还有其他解决办法吗