2012-05-12 11 views
5

इम यह पेज http://www.scala-lang.org/node/137 पढ़ने, मैं समझता हूँ कि क्या सहप्रसरण है और निचले सीमा के रूप में अच्छी तरह से है, लेकिन क्या यह स्पष्ट नहीं है इस लाइन है:स्काला कम प्रकार सीमा और सहप्रसरण

दुर्भाग्य से, इस कार्यक्रम को संकलित नहीं है क्योंकि एक covariance एनोटेशन केवल तभी संभव है जब टाइप वैरिएबल का उपयोग केवल कॉन्वेंटेंट स्थितियों में किया जाता है। चूंकि टाइप वैरिएबल टी विधि पैरापेड के पैरामीटर प्रकार के रूप में प्रकट होता है, इसलिए यह नियम टूटा हुआ है।

क्यों elem, T के महाप्रकार का एक उदाहरण होने के लिए करता है, तो पहले से ही ListNode covariant कारण है कि elem वर्तमान सूची के लिए prepended नहीं किया जा सकता है।

+0

स्पष्टीकरण बिल्कुल स्पष्ट है। टाइप वैरिएबल टी पैरामीटर प्रकार के रूप में दिखाई देता है। यह एक प्रतिष्ठित स्थिति नहीं है। यहां वास्तव में क्या समस्या है? –

उत्तर

2
class Super    {override def toString = "Super"} 
class Sub extends Super {override def toString = "Sub"; def subMethod {} } 
val sup = new Super 
val sub = new Sub 

कल्पना कीजिए कि निम्नलिखित की अनुमति दी गई:

// invalid code 
class Foo[+T] { 
    def bar(x: T) = println(x) 
} 

Foo के बाद से T पर covariant है, यह वैध (एक सरल Upcast, के बाद से एक Foo[Sub] एक Foo[Super] है):

val foo : Foo[Super] = new Foo[Sub] { 
    override def bar(x: Sub) = x.subMethod 
} 

अब foo है, जहां तक ​​हम जानते हैं, Foo[Super] किसी अन्य की तरह, लेकिन इसकी bar विधि काम नहीं करेगा, bar कार्यान्वयन की आवश्यकता है, क्योंकि एक Sub:

foo.bar(sup) // would cause error! 
+0

ठीक है, मैं समझता हूं, अब 'इस प्रोग्राम को संकलित नहीं किया गया है' लाइन से स्केल साइट के रूप में, इसका मतलब यह नहीं है कि हम वास्तव में इस विशेष कोड में कुछ का उल्लंघन कर रहे हैं और हम स्पष्ट रूप से Foo [SomeClass] subclassing नहीं कर रहे हैं, संकलक बस एक संभावित रनटाइम त्रुटि के खिलाफ सुरक्षा कर रहा है, क्या मैं गलत हूँ? – loki

+0

आप सही हैं, लेकिन यह स्थिर टाइपिंग के किसी अन्य नियम को लागू करने वाले कंपाइलर की तरह है, जैसे आपको स्ट्रिंग्स पर सूची विधियों को कॉल करने की अनुमति नहीं देना। जैसा कि उपर्युक्त दिखाता है, यह तर्कसंगत रूप से असंगत होगा कि किसी विधि के बहस को एक कॉन्वेंट प्रकार के रूप में अनुमति दी जा सके, इसलिए यह आपको नहीं देता है। –

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