5

Scala 2.10.0 マイルストーン 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

ここで驚きはありません: 型の親を要求して、期待どおりの結果を得ることができます。ここで、基本的に上記の 2 つの例を組み合わせます。

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

これがどのように間違っているのか理解できません。Fextend A[Seq[D]]、などがある場合も同じことが起こりA[Int]ます。この動作を意味のあるものにするために、私が見逃している一般化は何ですか?

4

2 に答える 2

6

それはバグです。今朝、私はそれを調査して修正するつもりでした。

編集します。これは、ユーザーランドに漏れる Scala リフレクション API の実装の詳細のようです。なかなか直らないので現状のままですが、改善の可能性を探っていきます。

それまでの間、正しい結果を得るには=:=、 ではなく、型の比較に常に を使用する必要があり==ます。

于 2012-06-29T08:56:22.597 に答える
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 以外でも発生することを確認しています)。

于 2012-06-29T02:55:51.470 に答える