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]
还有其他解决办法吗