斯卡拉2.10反射API中键入平等(Type equality in the Scala 2.10

2019-09-18 17:23发布

我运行到与反射一个奇怪的问题斯卡拉2.10.0里程碑4 ,我不能绕到我的头。 先来说说我的作品所希望的方式的东西:

scala> import scala.reflect.runtime.universe._
import scala.reflect.runtime.universe._

scala> trait A[X]; trait B[Y] extends A[Y]
defined trait A
defined trait B

scala> typeOf[B[String]].parents
res0: List[reflect.runtime.universe.Type] = List(java.lang.Object, A[String])

scala> typeOf[B[String]].parents contains typeOf[A[String]]
res1: Boolean = true

同样(在同一个会话):

scala> trait D; trait E extends A[D]
defined trait D
defined trait E

scala> typeOf[E].parents
res2: List[reflect.runtime.universe.Type] = List(java.lang.Object, A[D])

scala> typeOf[E].parents contains typeOf[A[D]]
res3: Boolean = true

没有惊喜在这里:我可以要求一个类型的父母,并得到正是我期望的那样。 现在我基本上是结合上面的两个例子:

scala> trait F extends A[String]
defined trait F

scala> typeOf[F].parents
res4: List[reflect.runtime.universe.Type] = List(java.lang.Object, A[String])

scala> typeOf[F].parents contains typeOf[A[String]]
res5: Boolean = false

我不明白这到底是怎么是假的。 同样的事情发生,如果我有F延长A[Seq[D]] A[Int]等什么我失踪,将使这种行为泛化有意义吗?

Answer 1:

这是一个错误。 今天上午右键我去调查并解决它。

编辑 。 这似乎是Scala的反射API的泄漏到用户态的实现细节。 这并不容易解决,所以现在我们离开它,因为它是,但考虑到提高准备。

同时,以得到正确的结果,每个人都应该使用=:=比较类型,而不是==



Answer 2:

陌生的另一图示:

scala> val atype = typeOf[A[String]]
atype: reflect.runtime.universe.Type = A[String]

scala> val atype2 = typeOf[F].parents(1)
atype2: reflect.runtime.universe.Type = A[String]

scala> typeOf[F].parents contains atype
res39: Boolean = false

scala> typeOf[F].parents contains atype2
res40: Boolean = true

我想你看到类似这样的一个错误: https://issues.scala-lang.org/browse/SI-5959 (虽然我确认这奇怪发生REPL外面太)。



文章来源: Type equality in the Scala 2.10 Reflection API