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