我在Scala 2.10.0 Milestone 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]
等,也会发生同样的事情。我错过了哪些概括会使这种行为有意义?
答案 0 :(得分:6)
这是一个错误。今天早上我正在调查并解决它。
修改即可。这似乎是泄漏到用户空间的Scala反射API的实现细节。修复并不容易,所以现在我们保持原样,但会考虑改进的可能性。
同时,要获得正确的结果,应始终使用=:=
来比较类型,而不是==
。
答案 1 :(得分:3)
陌生感的另一个例子:
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之外)。