2013-08-06 8 views
12

पथ पर निर्भर प्रकार उपयोगी होते हैं:निर्भर प्रकार रचनाकारों के लिए काम नहीं कर रहे हैं?

trait Sys { 
    type Global 
} 
def foo[S <: Sys](system: S)(global: system.Global) =() 

क्यों नहीं निर्माताओं के लिए यह काम करता है?

class Foo[S <: Sys](val system: S)(val global: system.Global) 

या क्या मैं बस गलत कर रहा हूं?

+0

मुझे यह वाक्य एसएलएस में मिला है: * हालांकि, एक औपचारिक मूल्य पैरामीटर किसी भी मूल वर्ग या वर्ग टेम्पलेट के सदस्यों के प्रकार का हिस्सा नहीं बन सकता है। * (5.3, पी 56) * औपचारिकता के संबंध में प्राथमिक कन्स्ट्रक्टर * के लिए मान पैरामीटर खंड। – Beryllium

+4

वर्कअराउंड: 'विशेषता फू [एस: <एसआईएस] {वैल सिस्टम: एस; वैल ग्लोबल: सिस्टम। ग्लोबल} '। – senia

+0

@senia हां, मैं अब एक विशेषता का उपयोग कर रहा हूं, कन्स्ट्रक्टर विधि हालांकि बहुत बदसूरत है, लेकिन यह काम करता है। –

उत्तर

5

यह मेरे लिए एक बग जैसा लगता है। संपादित करें: इसे मिला, यह SI-5712 है। 2.9 एसएलएस के

धारा §5.3 का कहना है:

(PS1)। । । (पीएसएन) कक्षा के प्राथमिक निर्माता के लिए औपचारिक मूल्य पैरामीटर खंड हैं। औपचारिक मूल्य पैरामीटर के दायरे में बाद के पैरामीटर अनुभाग और टेम्पलेट टी शामिल हैं।

हालांकि, एक औपचारिक value पैरामीटर माता पिता वर्ग या वर्ग टेम्पलेट टी के सदस्यों में से किसी के प्रकार का हिस्सा नहीं हो सकता है:

एक अपवाद नहीं है।

लेकिन यह कहना है कि वह, माता पिता के वर्ग या सदस्यों के किसी भी के प्रकार का हिस्सा नहीं हो सकता है निम्न पैरामीटर वर्गों के किसी भी की नहीं है, इसलिए इसे के बीच पथ पर निर्भर प्रकार न करे लगता नहीं है तर्क समूह

आप इस के चारों ओर एक माध्यमिक निर्माता के साथ जा सकते हैं:

class Foo[S <: Sys] private[this]() { 
    def this(system: S)(global: system.Global) = this 
} 

संपादित: इस माध्यमिक निर्माता वैकल्पिक हल बहुत अच्छा नहीं है: उजागर system या global बहुत मुश्किल हो गया है क्योंकि केवल प्राथमिक निर्माता val रों घोषणा कर सकते हैं ।

एक कलाकारों के साथ एक उदाहरण:

class Foo[S <: Sys] private[this]() { 
    private[this] var _system: S = _ 
    private[this] var _global: system.Global = _ 

    def this(system0: S)(global0: system0.Global) = { 
    this 
    _system = system0 
    _global = global0.asInstanceOf[system.Global] 
    } 

    lazy val global: system.Global = _global 
    lazy val system: S = _system 
} 

लेकिन इस भयानक हो रही है। @ सेनिया का सुझाव बहुत बेहतर है।

+0

ठीक है। हालांकि, द्वितीयक कन्स्ट्रक्टर के साथ समस्या यह है कि इस तरह से मैं 'डीयू ग्लोबल' सिस्टम 'ग्लोबल' युक्त 'फू' बनाने में सक्षम नहीं हूं (मैंने कोशिश नहीं की है, लेकिन यह असंभव लगता है) –

+0

हम, आप ठीक है, इन मूल्यों का खुलासा करने के लिए 'Foo' के लिए कोई आसान तरीका नहीं है। आपको कम से कम एक 'var' और एक कास्ट की आवश्यकता होगी, जो थोड़ा दुखी है, संपादन देखें। – gourlaysama

+1

बग टिकट –

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