2012-06-29 15 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 

:今、私は基本的に上記の2つの例を兼ね備えています。 FA[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)が原因です。 –