2009-09-13 18 views
11
public abstract class AbstractTool<AT extends AbstractThing> { 
    protected ArrayList<AT> ledger; 
    public AbstractTool() { 
     ledger = new ArrayList<AT>(); 
    } 

    public AT getToolAt(int i) { 
     return ledger.get(i); 
    } 

    // More code Which operates on Ledger ... 

} 

public class Tool<AT extends AbstractThing> extends AbstractTool { 
    public Tool() { 
     super(); 
    } 
} 

के सही उपयोग कैसे मैं सही ढंग से सुपर कहते हैं AbstractTool निर्माता को Tool की AT सामान्य पारित करने के लिए?विस्तार जेनेरिक सार कक्षा और सुपर

यह कोई फर्क नहीं पड़ता कि मैं क्या लगता है AT लेने जब मैं Tool (कहो, Tool<Thing>) की घोषणा होने के लिए, कि मैं हमेशा Thing के बजाय एक AbstractThing वापस मिलता है। यह जेनेरिक के उद्देश्य को हराने के लिए प्रतीत होता है ...

सहायता?

उत्तर

19
public class Tool<AT extends AbstractThing> extends AbstractTool<AT> { 

दूसरे शब्दों में, यदि आप जेनेरिक के साथ कुछ विस्तार या कार्यान्वित करते हैं, तो उनके लिए जेनेरिक तर्क परिभाषित करना याद रखें।

+1

वास्तव में इस मामले में, क्योंकि सारटूल के जेनेरिक पैरामीटर पर प्रकार की बाधाएं विरासत में प्राप्त होंगी, आप केवल 'पब्लिक क्लास टूल लिख सकते हैं AbstractTool '। यह कार्यात्मक रूप से समतुल्य होगा क्योंकि AbstractTool की परिभाषा आपको एक सामान्य पैरामीटर का उपयोग करने से रोकती है जो 'सार तत्व' नहीं थी। –

3

क्या यह Tool<AT extends...> extends AbstractTool<AT> नहीं होना चाहिए?

0

मुझे लगता है कि आप शायद चाहते हैं:

public abstract class AbstractTool<AT extends AbstractThing> { 
     protected List<AT> ledger = new ArrayList<AT>(); 

     public AT getToolAt(int i) { 
      return ledger.get(i); 
     } 

     // More code Which operates on Ledger ... 

    } 

    public class Tool extends AbstractTool<Thing> { 
     // Tool stuff ... 
    } 

Tool के बाद से एक ठोस वर्ग, यह अपने आप में parametrized जा की जरूरत नहीं है है। यदि आप घोषणा पर List (ओह और इंटरफ़ेस में प्रोग्राम को याद रखना) प्रारंभ करते हैं तो रचनाकारों की कोई आवश्यकता नहीं है, और क्योंकि यह संरक्षित है, उप-वर्ग सीधे इसे एक्सेस कर सकते हैं।

+0

थायर वास्तव में कुछ मौके हैं जहां कंक्रीट कक्षाओं के पैरामीट्रिजेशन के लिए बहुत उपयोगी है। ArrayList, LinkedList, हैश मैप, हैशसेट, उनमें से सभी parametrized हैं, और वे सभी भी ठोस कक्षाएं हैं। –

+1

मैंने यह नहीं कहा कि वहां नहीं थे। लेकिन अगर आपको ऐसा करने की ज़रूरत नहीं है तो यह क्लाइंट कोड को बहुत सरल बनाता है। कंटेनर प्रकार के वर्गों को स्पष्ट रूप से उनके ठोस प्रकारों को पैरामीटरकृत करने की आवश्यकता होती है, और शायद मैं न्यूनतम उदाहरण में बहुत अधिक पढ़ रहा था, लेकिन मुझे नहीं लगता कि ओपी को इसकी आवश्यकता है। – Robert

+0

ठीक है, मैं आपके बिंदु को समझता हूं :) –

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