2011-11-04 2 views
8

जावा 6 TreeSet<E> प्रलेखन से नहीं ले करता है? केवल एक ही वस्तु जिसे जोड़ा जा सकता है, टाइप ई है, इसलिए यह एकमात्र हटाने योग्य प्रकार प्रकार का होना चाहिए E.क्यों जावा के TreeSet <E> निकालें (वस्तु) एक ई

+5

संबंधित: http://stackoverflow.com/questions/857420/what-are-the-reasons-why-map-getobject-key-is-not-fully-generic –

+0

संभव डुप्लिकेट [जावा क्यों नहीं हैं संग्रह जेनेरिक तरीकों को हटाते हैं?] (Http://stackoverflow.com/questions/104799/why-arent-java-collections-remove-methods-generic) – PhoneixS

उत्तर

4

remove(), get() की तरह जब एक बराबर तत्व दिए गए (.equals() के संदर्भ में) काम करने के लिए आवश्यक है। जावा में, विभिन्न वर्गों की वस्तुओं के बराबर होने के लिए यह संभव है (और कुछ मामलों में, आवश्यक)। इसलिए, आपको इस प्रकार को प्रतिबंधित नहीं करना चाहिए।

0

ठीक है, प्रत्येक ई भी एक वस्तु है, और शायद आपके पास ई के रूप में ई नहीं है पल (उदाहरण के लिए एक इवेंट स्रोत से), जो आपके लिए सुविधाजनक बनाता है। अन्यथा आपको इसे हटाने के लिए इसे केवल ई पर डालना होगा।

समानता बिंदु से यह कोई फर्क नहीं पड़ता: दिए गए ऑब्जेक्ट का संदर्भ पता परीक्षण किया जाता है यदि यह किसी सेट की सामग्री के बराबर होता है, तो इससे कोई फर्क नहीं पड़ता कि यह कौन सी कक्षा है।

9

पहली टिप्पणी से जवाब लेना पोस्ट:

मिथक:

एक लोकप्रिय मिथक है कि यह बेवकूफ और बुराई है, लेकिन यह पिछली संगतता के कारण जरूरी हो गया था। लेकिन संगतता तर्क अप्रासंगिक है; एपीआई सही है कि आप संगतता पर विचार करें या नहीं।

रियल कारण:

समान रूप से, (और गूगल संग्रह पुस्तकालय) जावा संग्रह फ्रेमवर्क के तरीके कभी नहीं जब यह हो रहा से संग्रह को रोकने के लिए आवश्यक है को छोड़कर अपने मापदंडों के प्रकारों को प्रतिबंधित टूटा हुआ।

यहां अधिक पढ़ें: Why does Set.contains() take an Object, not an E?

0

यह वास्तव में एक समस्या है। अगर कोई remove(o) और o का प्रकार E नहीं है, तो यह आमतौर पर एक प्रोग्रामिंग बग है जो गलत चीज़ को हटाने का प्रयास करता है। टाइपिंग जांच हमें बग से बचाने में विफल रही।

हालांकि एक अच्छा आईडीई (इंटेलिजे) ऐसे मुद्दों का पता लगा सकता है और हमें चेतावनी देता है, एपीआई डिजाइनरों को कंपाइलर प्रकार की जांच का उपयोग करने के लिए अधिक सटीक हस्ताक्षर प्रदान करना चाहिए था। (आईडीई यहाँ धोखा देती है -। यह Set.remove() का अर्थ जानता है, क्योंकि यह एक मानक एपीआई है आईडीई कस्टम एपीआई के लिए एक ही मदद प्रदान नहीं करेगा)

जैसी क्वेरी एपीआई के लिए यह एक गैर E तर्क और बदले स्वीकार करने के लिए ठीक है एक मामूली झूठा इसलिए हम remove() तरह उत्परिवर्तन एपीआई के लिए दोनों

boolean contains(Object o); 
boolean contains2(E o); 

हो सकता है, यह बहस का मुद्दा है कि क्या यह एक गैर E तर्क को स्वीकार करना चाहिए।हालांकि बहस की वास्तविकता को देखते हुए बहस चल रही है - वास्तव में कोई विकल्प नहीं है लेकिन गैर-ई तर्क स्वीकार करते हैं और इसके बारे में चुप रहें। फिर भी हम ज्यादातर मामलों में दो तरीकों

boolean remove(Object o); 
boolean remove2(E o); 

हो सकता है, प्रोग्रामर अतिरिक्त प्रकार की सुरक्षा के लिए contains2/remove2 कॉल कर सकते हैं।

+0

क्या आप कह रहे हैं कि 'remove2/include2' TreeSet विधियां हैं? मैं एपीआई में नहीं देख रहा हूँ ... – ComputerDruid

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