2012-06-29 68 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。 –

相關問題