2012-06-29 7 views
5

Я столкнулся с странной проблемой с отражением в Scala 2.10.0 Milestone 4, что я не могу окутать голову. Во-первых для материала, который работает так, как я хотел бы ожидать:Тип равенства в Scala 2.10 Reflection 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

Это ошибка. Прямо сегодня утром я собирался расследовать и исправить это.

Редактировать. это, по-видимому, представляет собой деталь реализации API отражения Scala, протекающего в пользовательской области. Это нелегко исправить, поэтому пока мы оставим это как есть, но рассмотрим возможности для улучшения.

В то же время для получения правильных результатов всегда следует использовать =:= для сравнения типов, а не ==.

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 (хотя я подтвердил, что это странность происходит за пределами РЕПЛИ тоже).

+1

Правильно, это также происходит вне REPL. Спасибо за отчет! –

+3

Обновление. Это на самом деле вызвано неправильным поведением типаOf: https://issues.scala-lang.org/browse/SI-6005. –