如果一个类包含一个内部类,并且在该类中生成TypeTag
,则生成的TypeTag
将包含内部类型,即#34;相对于容器"并且与TypeTag
的泛型类型参数不匹配。 E.g:
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]
还有其他解决方法吗?