Scala:为类中的内部类型生成的TypeTag并不匹配它的类型

时间:2015-07-22 10:27:21

标签: scala reflection inner-classes

如果一个类包含一个内部类,并且在该类中生成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.tTypeTag[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]

还有其他解决方法吗?

0 个答案:

没有答案