2012-06-29 8 views
5

Ich bin in ein seltsames Problem mit der Reflexion in Scala 2.10.0 Milestone 4, die ich nicht meinen Kopf wickeln kann. für das Material zuerst, die so funktioniert, würde ich erwarten:Geben Sie die Gleichheit in der 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 

ähnlich (in der gleichen Sitzung):

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 

Keine Überraschungen hier: Ich für eine Art Eltern fragen kann und genau das bekommen, was Ich erwarte. Jetzt kombiniere ich im Wesentlichen die beiden obigen Beispiele:

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 

Ich verstehe nicht, wie das falsch sein könnte. Das Gleiche passiert, wenn ich F extendiere A[Seq[D]], A[Int] usw. Was ist die Verallgemeinerung, die ich vermisse, die dieses Verhalten sinnvoll machen würde?

+1

Ich habe gerade bestätigt, dass dies in 2.10.0-M5 behoben ist. –

Antwort

6

Das ist ein Fehler. Genau heute Morgen wollte ich es untersuchen und beheben.

Bearbeiten. Dies scheint ein Implementierungsdetail der Scala-Reflektions-API zu sein, die in das Benutzerland eindringt. Es ist nicht leicht zu reparieren, also lassen wir es jetzt so wie es ist, aber wir werden uns die Möglichkeiten ansehen, um es zu verbessern.

Um korrekte Ergebnisse zu erhalten, sollte man immer =:= verwenden, um Typen zu vergleichen, nicht ==.

3

Eine andere Darstellung der Fremdheit:

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 

Ich glaube, Sie einen Fehler ähnlich wie diese sehen: https://issues.scala-lang.org/browse/SI-5959 (obwohl ich, dass diese Merkwürdigkeit außerhalb des REPL tritt auch bestätigt haben).

+1

Richtig, das passiert auch außerhalb von REPL. Danke für den Bericht! –

+3

Ein Update. Dies wird durch falsches Verhalten von typeOf: https://issues.scala-lang.org/browse/SI-6005 verursacht. –

Verwandte Themen