2012-06-29 22 views
5

में समानता टाइप करें मैं Scala 2.10.0 Milestone 4 में प्रतिबिंब के साथ एक अजीब समस्या में भाग रहा हूं कि मैं अपने सिर को चारों ओर लपेट नहीं सकता। सामान कि जिस तरह से काम करता है के लिए सबसे पहले मैं उम्मीद थी:स्कैला 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 

इसी तरह (एक ही सत्र में):

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 

मुझे समझ में नहीं आता कि यह कैसे गलत हो सकता है। वही बात होती है यदि मेरे पास FA[Seq[D]], A[Int] इत्यादि का विस्तार करें। आदि सामान्यीकरण क्या है जो मुझे याद आ रहा है जिससे यह व्यवहार समझ में आता है?

+1

मैंने अभी पुष्टि की है कि यह 2.10.0-एम 5 में तय है। –

उत्तर

6

यह एक बग है। ठीक उसी सुबह मैं जांच करने और इसे ठीक करने जा रहा था।

संपादित करें। यह उपयोगकर्तालैंड को स्केल प्रतिबिंब एपीआई लीकिंग का कार्यान्वयन विवरण प्रतीत होता है। इसे ठीक करना आसान नहीं है, इसलिए अब हम इसे छोड़ देते हैं, लेकिन सुधारने की संभावनाओं को देखेंगे।

इस बीच, सही परिणाम प्राप्त करने के लिए, == पर तुलना करने के लिए किसी को हमेशा =:= का उपयोग करना चाहिए।

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

ठीक है, यह आरईपीएल के बाहर भी होता है। रिपोर्ट के लिए धन्यवाद! –

+3

एक अद्यतन। यह वास्तव में टाइपऑफ: https://issues.scala-lang.org/browse/SI-6005 के गलत व्यवहार के कारण होता है। –

संबंधित मुद्दे