2012-05-06 13 views
9

मैं अपने सबक्लास जेनेरिक को रखना चाहता हूं, और मैं बदलना चाहता हूं add(Object) ऐरेलिस्टिस्ट की विधि है ताकि जब आप arrayList.add(null) पर कॉल करते हैं तो यह कुछ भी नहीं जोड़ देगा (ArrayList का सामान्य कार्यान्वयन null जोड़ देगा; मैं इसे करना चाहता हूं कुछ भी तो नहीं)।जावा - कैसे सामान्य ArrayList उपवर्ग के लिए इतना है कि MyArrayList <foo> के उदाहरण ArrayList <foo> की उपवर्गों हो जाएगा?

+2

विचार पुलिस इस सब पर झुका रही है। ओपी की आवश्यकता स्पष्ट रूप से बताई गई है, और मुझे कोई कारण नहीं दिख रहा है कि पूछे जाने वाले प्रश्न का उत्तर क्यों नहीं दिया जा सका। @fbafelip ने दिखाया है कि यह कैसे करें। उल्लिखित प्रतिनिधिमंडल विकल्पों में परिमाण के अधिक कोड की आवश्यकता होती है। – EJP

+4

'ArrayList '(या किसी भी' सूची ') में तत्व जोड़ने के कई तरीके हैं: 'जोड़ें (टी) ',' जोड़ें (int, टी) ',' addAll (संग्रह ) ',' addAll (पूर्णांक, संग्रह ) ', कंस्ट्रक्टर्स के माध्यम से, और के माध्यम से' 'इटरेटर की add' तरीकों' और 'ListIterator ' और एक दृश्य को संशोधित करने के माध्यम से ऊपर तरीकों में से किसी में 'subList' साथ लौट आए। क्या आपको इन सभी को संभालने की ज़रूरत है? – trutheality

+0

सोचा पुलिस? वास्तव में, आप मेरे उत्तर की कुलपति राज्य की तुलना करने जा रहे हैं? क्योंकि मैं जो भी उपयोग कर रहा हूं वह प्राधिकरण से एक तर्क है ... सही गोचा। –

उत्तर

13

आपको वास्तव में इस मामले में विरासत पर संरचना का पक्ष लेना चाहिए, क्योंकि यदि आप किसी तत्व को जोड़ने/बदलने के लिए भूल जाते हैं (उदाहरण के लिए, आप सेट को ओवरराइड करना भूल सकते हैं), यह अभी भी संभव होगा शून्य तत्वों के लिए।

लेकिन सवाल के बाद से कैसे ArrayList उपवर्ग के बारे में था, यहाँ तुम कैसे करते है:

import java.util.ArrayList; 

public class MyArrayList<T> extends ArrayList<T> { 
    public boolean add(T element) { 
     if (element != null) return super.add(element); 
     return false; 
    } 
} 
+0

यह समाधान उचित है यदि आप गारंटी दे सकते हैं कि यह एकमात्र ऐसा स्थान है जहां आप सरणी सूची के व्यवहार को संशोधित करेंगे, क्योंकि तब यह कार्यान्वयन विवरण पारदर्शी रूप से पारदर्शी है। – Jeremy

+0

आपको मेरे संपादित संस्करण को क्यों पसंद नहीं आया? यह व्यवहार में समान था लेकिन बेहतर कोड था (कई कारणों से)। – Bohemian

+1

@ बोहेमियन मैं बस इसे और अधिक स्पष्ट रखना चाहता था, क्योंकि यह एक नमूना कोड है। – fbafelipe

10

यह एक उदाहरण है जहां आपको विरासत पर संरचना का पक्ष लेना चाहिए।

ArrayList को विस्तारित करने के बजाय, आपको एक कक्षा बनाना चाहिए जिसमें ArrayList सदस्य फ़ील्ड है और add विधि का खुलासा करता है जो सही काम करता है।

Effective Java पढ़ें। यहां example है जो विशेष रूप से इस समस्या का वर्णन करता है।

+2

मैं मानता हूं कि उसे विरासत पर संरचना का पक्ष लेना चाहिए, लेकिन शायद वह बाहरी पुस्तकालय में ऐरेलिस्ट को पास कर देगा, इसलिए उस मामले में संरचना काम नहीं करेगी। वह पूछता है कि इसे कैसे घटाया जाए, न कि उसे चाहिए। – fbafelipe

+1

आपका उद्धरण और उदाहरण लागू नहीं होता है। ओपी * विशेष रूप से चाहता है * जो भी सुपरक्लास का व्यवहार है। – EJP

+2

यह वास्तव में प्रश्नकर्ता की मदद नहीं करता है। उनका अगला प्रश्न होगा:> जेनेरिक सूची को कैसे विभाजित करें ताकि MyList के उदाहरण सूची के उप-वर्ग होंगे? – xehpuk

0

आप एक फिल्टर जहां ऐड विधि कहा जाता है लागू करने पर विचार किया है? अगर इसे आपके कोड में केवल एक ही स्थान से बुलाया जा रहा है, तो यह सबसे आसान हो सकता है। अगर कथन काम कर सकता है तो एक साधारण।

if (input/object != null) { 
    arrayList.add(input/object); 
} 
else { 
    //do something else instead, or nothing 
} 
0

यह क्या एक सूची में चला जाता है सीमित करना चाहता है, हालांकि चुपचाप एक तर्क अनदेखी संदिग्ध है पूरी तरह से सम्मानजनक है। फिर भी, यही कारण है कि हमारे पास Apache Commons Collections है। शायद एक अमरूद समकक्ष है। ArrayList के उप-वर्ग घोषित करने के लिए उनमें से एक का उपयोग करें, इसलिए कोई भी आपके इरादों को विचलित नहीं कर सकता है।