Tra*_*own 5 reflection types scala scala-2.10
我在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
Run Code Online (Sandbox Code Playgroud)
同样(在同一个会话中):
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
Run Code Online (Sandbox Code Playgroud)
这里没有惊喜:我可以要求一个类型的父母,并得到我期望的.现在我基本上结合了上面的两个例子:
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
Run Code Online (Sandbox Code Playgroud)
我不明白这是怎么回事.如果我有F扩展A[Seq[D]],A[Int]等等,会发生同样的事情.我所缺少的概括是什么会使这种行为有意义?
那是一个错误.今天早上我正在调查并解决它.
编辑.这似乎是泄漏到用户空间的Scala反射API的实现细节.它不容易修复,所以现在我们保持原样,但会考虑改进的可能性.
同时,为了得到正确的结果,应该总是=:=用来比较类型,而不是==.