2011-12-12 17 views

उत्तर

17

आपके पास एक प्रकार का गुण नहीं हो सकता है। अन्य चीजों के साथ, एक सार्वजनिक def v_=(newV: T) के साथ एक var मात्रा होने के कारण, यह टी को नियमित तर्क के रूप में प्रकट करता है, जो एक विरोधाभासी स्थिति है। तो आप या तो

  • त्याग सहप्रसरण चाहिए और सी [टी] के बजाय सी [+ T]
  • मेकअप va वैल घोषित

की "क्यों" हिस्से पर एक छोटे से अधिक वर्बोज़ होना करने के लिए आपका प्रश्न, टी को टी + के साथ 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 प्रकार पैरामीटर टी को मना कर रहा है।

+0

एक तीसरा विकल्प है ... –

+0

धन्यवाद बहुत डैनियल, मैंने निजी के साथ एक तीसरा संस्करण लिखा था और परीक्षण के बाद इसे हटा दिया था, मैं [यह] भूल गया था –

2

आपको इसे val बनाना है। var में हमेशा एक सेटर विधि होती है जहां प्रकार contravariant स्थिति में दिखाई देता है।

9

आप private[this] के रूप में यह घोषणा कर सकते हैं:

class C [+T] { private[this] var v : T = _ } 

किसी उपयोग के लिए आप की कोशिश है कि इस दायरे की अनुमति नहीं है एक सह संस्करण T साथ असुरक्षित होगा।

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