2012-06-29 18 views
5

Me encuentro con un problema extraño con la reflexión en Scala 2.10.0 Milestone 4 que no puedo entender. En primer lugar para las cosas que funciona de la manera que cabe esperar:Escriba la igualdad en la API de Reflexión de Scala 2.10

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 

mismo modo (en la misma sesión):

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 

No hay sorpresas aquí: Puedo preguntar por los padres de un tipo y obtener exactamente lo Espero. Ahora esencialmente combino los dos ejemplos anteriores:

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 

No entiendo cómo esto podría ser falso. Lo mismo sucede si tengo F extienden A[Seq[D]], A[Int], etc. ¿Cuál es la generalización que me falta que haría que este comportamiento tenga sentido?

+1

Acabo de confirmar que esto se ha solucionado en 2.10.0-M5. –

Respuesta

6

Eso es un error. Justo esta mañana iba a investigar y arreglarlo.

Editar. esto parece ser un detalle de implementación de la API de reflexión de Scala que se escapa al territorio del usuario. No es fácil de arreglar, así que por ahora lo dejamos tal como está, pero buscaremos las posibilidades de mejorar.

Mientras tanto, para obtener resultados correctos, siempre se debe usar =:= para comparar tipos, no ==.

3

Otra ilustración de la extrañeza:

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 

Creo que se está viendo un error similar a éste: https://issues.scala-lang.org/browse/SI-5959 (aunque he confirmado que esta singularidad se produce fuera de la REPL también).

+1

Correcto, esto también ocurre fuera de REPL. Gracias por el informe! –

+3

Una actualización. Esto es en realidad causado por un comportamiento incorrecto de typeOf: https://issues.scala-lang.org/browse/SI-6005. –

Cuestiones relacionadas