2012-05-08 10 views
13

मैं बहुत सारी संख्याओं के साथ एक प्रोग्राम लिख रहा हूं, और मुझे EnumMap की कीसेट को बहुत कुछ वापस करना है। लेकिन EnumMap.keySet() एक Set() देता है, तो आदेश प्राप्त करने के लिए EnumSet मैं चाहता हूँ, मैं एक डाली उपयोग करने के लिए:EnumMap <T> क्यों .keySet() एक सेट <T>() वापस करें और एनमसेट <T>() नहीं?

EnumMap<SomeEnum, Object> myMap = getMap(); 
EnumSet<SomeEnum> myEnum = (EnumSet<SomeEnum>) myMap.keySet(); 

अगर मैं डाली नहीं है, संकलक एक प्रकार मेल नहीं खाता की शिकायत करेंगे; यह Set<SomeEnum> से EnumSet<SomeEnum> में परिवर्तित नहीं कर सकता है। ऐसा करने के लिए अनावश्यक लगता है, क्योंकि एनमैप की चाबियाँ हमेशा एक गणना होगी। क्या किसी को पता है कि keySet() विधि इस तरह क्यों बनाई गई थी? मैंने कभी सोचा है कि एनमसेट एक अमूर्त वर्ग होने के साथ ऐसा कुछ हो सकता है, लेकिन निश्चित रूप से EnumMapEnumSet प्रदान करने वाली फैक्ट्री विधि को वापस लौटा सकता है।

चीयर्स, सब!

संपादित करें: मुझे बहुत खेद है, उपरोक्त कोड CastClassException फेंकता है। आप

EnumSet<SomeEnum> myEnum = EnumSet.copyOf(myMap.keySet()); 

का उपयोग कर EnumSet प्राप्त कर सकते हैं मुझे वास्तव में पोस्ट करने से पहले जांच करनी चाहिए थी।

+5

आपको 'सेट ' मिलता है। 'EnumSet ' होने का लाभ क्या होगा? –

+0

@PaulBellora आप सही हैं, ऊपर गलत है। मैं इसे सही कर दूंगा। होना चाहिए 'एनमसेट myEnum = EnumSet.copyOf (myMap.keySet()); ' – jalopezp

+0

इनलाइन स्टाइल javadoc के साथ स्रोत का एक अच्छा दृश्य भी है: http://grepcode.com/file/repository.grepcode.com /java/root/jdk/openjdk/6-b14/java/util/EnumMap.java#EnumMap.keySet%28%29 –

उत्तर

8

मुझे लगता है कि यह keySetEnumSet नहीं है। ;)

कारण यह नहीं है कि keySet अंतर्निहित मानचित्र पर एक दृश्य है।

myMap.keySet().removeAll(keysToRemove); // removes multiple keys. 
+0

लेकिन वैसे भी, बिंदु क्या होगा? –

+0

संकल्पनात्मक रूप से कीसेट() enum या enum set का एक सेट है। यदि एपीआई को अलग-अलग डिज़ाइन किया गया था तो हमारे पास एनमसेट इंटरफ़ेस हो सकता था लेकिन यह सेट के समान होगा, कोई व्यावहारिक लाभ नहीं है।यदि EnumSet आपको Enum विशिष्ट मेथडोस को इसके तत्व प्रकार की तरह रनटाइम पर दे सकता है, तो शायद इससे कोई फर्क पड़ सकता है। –

0

आप उस वर्ग के स्रोत के लिए जाना है, तो आप बेहतर scenerio कारण है कि यह Set लौटा रहा है समझ जाएगा। आप पा सकते हैं कि कम से यूआरएल

नीचे

http://www.docjar.com/html/api/java/util/EnumMap.java.html

आशा यह आप कर सकते हैं।

आनंद लें!

+0

यह वास्तव में अच्छा है, मुझे नहीं पता था कि मैं इसके लिए स्रोत देख सकता हूं! मैं एपीआई के साथ सभी के साथ काम कर रहा हूँ। लेकिन हाँ, मुझे लगता है कि विधि keySet() सेट कीसेट सेट करता है, जिसे सुपरक्लास में परिभाषित किया गया है, इसलिए मेरे पास यह कोई अन्य तरीका नहीं हो सका। बहुत बहुत धन्यवाद, मैं आनंद लेंगे! – jalopezp

+0

@jalopezp धन्यवाद दोस्त –

+3

जहां आपके लिंक में कोड की 800 लाइनों में मुझे प्रश्न का उत्तर मिल जाएगा? कृपया प्रासंगिक भाग का एक अंश पोस्ट करें। – Gabe

3

EnumSetSet का कार्यान्वयन है जो कुंजी स्थान का प्रतिनिधित्व करने के लिए एक enum का उपयोग होता है। कक्षा EnumSet कोई अतिरिक्त गैर-स्थैतिक विधियां प्रदान नहीं करती है, इसलिए EnumSet को केवल एक सादे Set पर वापस करने का कोई कारण नहीं होगा।

+0

सर्वश्रेष्ठ उत्तर अब तक और सरल IMHO । एपीआई डिज़ाइन के लिए प्रासंगिक कार्यान्वयन विवरण/प्रासंगिक नहीं है) या खराब धारणा है कि जावा के पास कॉन्वेंट रिटर्न प्रकार नहीं हैं (उपclass ओवर्रिडेन विधियों में रिटर्न वैल्यू के सबक्लास को वापस कर सकते हैं)। –

+0

+1 वास्तव में नीचे दिए गए कोड की तुलना में एपीआई डिज़ाइन को देखना बेहतर है। –

2

संपादित करें: मैं गलत था, कृपया अनदेखा करें।

EnumMap सार मैप बढ़ाता है, जो कीसेट घोषित करता है। सार मैप यह घोषणा नहीं कर सकता कि keySet EnumSet देता है, क्योंकि यह सार मैप के अन्य उप-वर्गों के लिए सत्य नहीं है। इसलिए, इसका रिटर्न प्रकार सेट है।

+3

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

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