2012-06-29 14 views
5

Mi sto imbattendo in un problema strano con la riflessione in Scala 2.10.0 Milestone 4 che non riesco a capirmi. In primo luogo per la roba che funziona il modo in cui mi aspetto:Tipo uguaglianza nell'API di Scala 2.10 Reflection

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 

Allo stesso modo (nella stessa sessione):

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 

Niente sorprese qui: posso chiedere i genitori di un tipo e ottenere esattamente quello Mi aspetto. Ora io essenzialmente combinare i due esempi sopra:

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 

Non capisco come questo potrebbe essere falsa. La stessa cosa accade se ho F estendere A[Seq[D]], A[Int], ecc. Qual è la generalizzazione che mi manca che renderebbe questo comportamento sensato?

+1

Ho appena confermato che è stato corretto in 2.10.0-M5. –

risposta

6

Questo è un bug. Proprio stamattina ho intenzione di indagare e sistemarlo.

Modifica. questo sembra essere un dettaglio di implementazione di Scala reflection API che sfugge all'area utente. Non è facile da risolvere, quindi per ora lo lasciamo così com'è, ma esamineremo le possibilità di migliorare.

Nel frattempo, per ottenere risultati corretti, si dovrebbe sempre usare =:= per confrontare i tipi, non ==.

3

Un altro esempio della stranezza:

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 

Penso che si sta vedendo un bug simile a questo: https://issues.scala-lang.org/browse/SI-5959 (anche se ho confermato che questo stranezza avviene al di fuori del REPL troppo).

+1

Giusto, questo accade anche al di fuori di REPL. Grazie per la segnalazione! –

+3

Un aggiornamento. Questo è in realtà causato da un comportamento errato di typeOf: https://issues.scala-lang.org/browse/SI-6005. –

Problemi correlati