2015-11-28 9 views
18

को देखते हुए Parent का एक सरल बीजीय डेटा प्रकार:अप्रत्याशित विशेषता व्यवहार

scala> sealed trait Parent 
defined trait Parent 

scala> case object Boy extends Parent 
defined object Boy 

scala> case object Girl extends Parent 
defined object Girl 

मैं एक विशेषता परिभाषित: फिर

scala> trait HasGirl { 
    | val x: Girl.type 
    | } 
defined trait HasGirl 

, मैं एक मामले वर्ग कि HasGirl कार्यान्वित बनाया है, लेकिन एक x मूल्य प्रदान की Boy.type का।

scala> case class Thing(x: Boy.type) extends HasGirl 
defined class Thing 

मैं एक संकलन समय त्रुटि की उम्मीद थी, के बाद से मैं नहीं दिख रहा है कि कैसे प्रकार Boy.type के xval x: Girl.type के अनुरूप है।

यहां क्या हो रहा है?

+0

'Thing' में' x' है:

sealed trait Parent case object Boy extends Parent case object Girl extends Parent trait HasGirl { val x: Girl.type } case class Thing(x: Boy.type) extends HasGirl { def y: Girl.type = (this: HasGirl).x } val t = Thing(Boy) t.y // ClassCastException ! 

अगर मैं एक सदस्य जोड़ने के लिए, आप एक संकलन समय त्रुटि मिलती है: उदाहरण के लिए, निम्नलिखित एक रनटाइम त्रुटि पैदा करता है विशेषता में 'x' से संबंधित? –

+0

खैर, 'थिंग' 'HasGirl' बढ़ाता है। चूंकि बाद वाले ''™' प्रकार' Girl.type' की अपेक्षा करता है, मैं * विश्वास करता हूं * कि 'थिंग' का' x: Boy.type' मानचित्र 'HasGirl'' x' पर है। –

+2

दरअसल, 'थिंग (बॉय) .asInstanceOf [HasGirl] .x'' java.lang.ClassCastException का उत्पादन करता है: लड़का $ $ Girl को नहीं डाला जा सकता है। दिलचस्प। – ale64bit

उत्तर

1

ऐसा लगता है कि सदस्यों के बिना सिंगलटन प्रकार किसी प्रकार से समकक्ष हैं। शायद यह एक बग है (आपने टिकट दायर किया है)।

sealed trait Parent 
case object Boy extends Parent 
case object Girl extends Parent { def hello = 1234 } 

trait HasGirl { 
    val x: Girl.type 
} 

case class Thing(x: Boy.type) extends HasGirl 
<console>:57: error: overriding value x in trait HasGirl of type Girl.type; 
value x has incompatible type 
     case class Thing(x: Boy.type) extends HasGirl 
         ^
+0

यह एक बग है, प्रति https://issues.scala-lang.org/browse/SI-9574 –

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