कॉन्वर्सिस से पूरी तरह से छुटकारा पाने के लिए निश्चित रूप से अस्वस्थ होगा, और इसकी अनुमति नहीं है। m: Map[A, String]
, और v : Any
दिए गए, आप val mm : Map[A, Any] = m + v
कर सकते हैं। यह Map
परिभाषा कहता है, और सभी कार्यान्वयनियों का पालन करना चाहिए। आपकी कक्षा परिवर्तनीय हो सकती है, लेकिन इसे मानचित्र के पूर्ण कॉन्वर्स इंटरफेस को कार्यान्वित करना होगा।
अब त्रुटि को फेंकने के लिए +
को फिर से परिभाषित करना एक अलग कहानी है (अभी तक बहुत अच्छी नहीं है)। आपके नए +
विधि के साथ समस्या यह है कि जेनेरिक मिटाने के बाद, यह अन्य +
विधि से समान हस्ताक्षर है। एक चाल है: अंतर्निहित पैरामीटर में जोड़ें, ताकि आपके हस्ताक्षर में दो पैरामीटर हों, जो इसे पहले से अलग करता है।
def +(kv : (A,B))(implicit useless: A <:< A) : MyMap[A,B]
(यह वास्तव में बात नहीं क्या निहित पैरामीटर आप देख रहे हैं, जब तक कि एक पाया जाता है। implicit useless: Ordering[String]
तरह ही काम करता है)
ऐसा करने से, आप अधिक भार के साथ सामान्य समस्या है । यदि आप ऐसा करने के लिए संकलक के बिना बी जोड़ते हैं, तो असफल विधि को बुलाया जाएगा। वहां एक प्रकार की जांच करने के लिए बेहतर हो सकता है ताकि बी इंस्टेंस स्वीकार किए जाएं। इसके लिए आपके मानचित्र में एक मैनिफेस्ट [बी] प्राप्त करने की आवश्यकता होगी।
स्रोत
2011-08-17 23:15:28
शायद आप प्राप्त करने के बजाय सदस्य मानचित्र का उपयोग कर सकते हैं? – Owen
इसके अलावा, इसे invariant क्यों होना चाहिए? मैंने सोचा था (हालांकि मुझे बहुत अधिक स्कैला नहीं पता) केवल एक बार जब आपको अचूकता की आवश्यकता होती है तो यह एक स्रोत और सिंक दोनों हो सकता है, लेकिन नक्शे अपरिवर्तनीय हैं, इसलिए यह एक सिंक नहीं हो सकता है। – Owen
मैं एक द्वि-दिशात्मक मानचित्र लागू करना चाहता हूं। यदि मैं मानचित्र को कार्यान्वित करता हूं तो कोई बड़ा सौदा नहीं है, और केवल दो आंतरिक मानचित्रों को आगे भेजता है जो आगे और पिछड़े मैपिंग को परिभाषित करते हैं, लेकिन मुझे उस मामले में आविष्कार की आवश्यकता है। –