2012-06-29 44 views
5

我遇到了一个奇怪的问题,在Scala 2.10.0 Milestone 4中反射,我无法环绕我的头。首先对于工作方式的东西,我会期望:Scala中的类型相等2.10反射API

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]等等。我错过了什么概括会使这种行为有意义?

+1

我刚刚证实,这是固定在2.10.0-M5。 –

回答

6

这是一个错误。今天早上我正要调查并修复它。

编辑。这似乎是泄漏到用户空间的Scala反射API的实现细节。修复起来并不容易,所以现在我们保持原样,但会研究改进的可能性。

与此同时,要得到正确的结果,应该总是使用=:=来比较类型,而不是==

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外面太)。

+1

对,这也发生在REPL之外。感谢报告! –

+3

更新。这实际上是由typeOf的错误行为引起的:https://issues.scala-lang.org/browse/SI-6005。 –

相关问题