class C [+T] { var v : T = _ }
कैसे covariant चर शुरू करने के लिए?
संकलक त्रुटि: covariant प्रकार टी मूल्य value_ के प्रकार टी में contravariant स्थिति में होता है =
क्यों? मैं इसे कैसे ठीक कर सकता हूं?
class C [+T] { var v : T = _ }
कैसे covariant चर शुरू करने के लिए?
संकलक त्रुटि: covariant प्रकार टी मूल्य value_ के प्रकार टी में contravariant स्थिति में होता है =
क्यों? मैं इसे कैसे ठीक कर सकता हूं?
आपके पास एक प्रकार का गुण नहीं हो सकता है। अन्य चीजों के साथ, एक सार्वजनिक def v_=(newV: T)
के साथ एक var मात्रा होने के कारण, यह टी को नियमित तर्क के रूप में प्रकट करता है, जो एक विरोधाभासी स्थिति है। तो आप या तो
की "क्यों" हिस्से पर एक छोटे से अधिक वर्बोज़ होना करने के लिए आपका प्रश्न, टी को टी + के साथ covariant पैरामीटर बनाकर, आप कहता है कि आप सी [बी] से ए [ए] के सी उपशीर्षक चाहते हैं यदि बी बी का उप प्रकार है। इसका मतलब है कि आप अनुमति देना चाहते हैं:
val cb: C[B] = new C[B]
val ca : C[A] = cb
यह आवाज बनाने के लिए, संकलक प्रतिबंधित करता है जहां टी में टी दिखाई दे सकता है इसे कम करने के लिए और मामूली सरलीकरण के साथ, v नियमित (या var के प्रकार के रूप में) के पैरामीटर के रूप में प्रकट नहीं हो सकता है। अन्यथा, तुम्हारे जाने के बाद सीबी प्रारंभ कर दिया है और इसके बाद के संस्करण के रूप में वर्णित ca आप, coulddo
ca.v = new A
यह अनुमति दी जाएगी, के रूप में ca
एक C[A]
माना जाता है इसलिए इसकी चर v
प्रकार A
की है। हालांकि, सी में टी, ca
में covariant है (उदाहरण में) संदर्भ C[B]
उदाहरण का संदर्भ दे सकता है। इस काम की अनुमति दी जाएगी, इसके बाद आपको
val vInCb: B = cb.v
विश्वास है कि इस आप एक बी देता है कर सकता है। हालांकि, आप ca
संदर्भ के माध्यम से ए पर बस डाल दें। इस स्थिति को प्रतिबंधित किया जाना चाहिए, और यह एक var के प्रकार के रूप में covariant प्रकार पैरामीटर टी को मना कर रहा है।
आपको इसे val
बनाना है। var
में हमेशा एक सेटर विधि होती है जहां प्रकार contravariant स्थिति में दिखाई देता है।
आप private[this]
के रूप में यह घोषणा कर सकते हैं:
class C [+T] { private[this] var v : T = _ }
किसी उपयोग के लिए आप की कोशिश है कि इस दायरे की अनुमति नहीं है एक सह संस्करण T
साथ असुरक्षित होगा।
एक तीसरा विकल्प है ... –
धन्यवाद बहुत डैनियल, मैंने निजी के साथ एक तीसरा संस्करण लिखा था और परीक्षण के बाद इसे हटा दिया था, मैं [यह] भूल गया था –