2010-06-22 20 views
9

मैं निम्नलिखित सार कक्षाएं:जावा जेनरिक और विरासत

public abstract class AbSuperClass1<K,S> { 
    //class definition 
} 

और:

public class Concrete2 extends AbSuperClass2<String, String>{ 
    public void method(Concrete1 arg){ 
     //method definition 
    } 
} 
:

public abstract class AbSuperClass2<K,S> { 
    public abstract <Q extends AbSuperClass1<K,S>> void method(Q arg); 
    ... 
} 

मैं तो दो ठोस कार्यान्वयन

public class Concrete1 extends AbSuperClass<String, String>{ 
    //class definition 
} 

और है 210

हालांकि, यह संकलित नहीं होगा, क्योंकि कंक्रीट 1 को कंक्रीट 2 में विधि के तर्क के लिए वैध प्रकार के रूप में पहचाना नहीं गया है, लेकिन जहां तक ​​मैं देख सकता हूं कि कंक्रीट 1 सही प्रकार का है, क्योंकि यह AbSuperClass1 को बढ़ाता है।

मैं गलत कहां जा रहा हूं?

+1

यदि संभव हो, तो मैं आपके जावा कोड को लिखने के लिए पर्यावरण के रूप में ग्रहण का उपयोग करने का सुझाव देता हूं। ग्रहण आपको वास्तव में गलत दिखाता है और माउस क्लिक के साथ लापता फ़ंक्शन को जोड़ने के लिए एक ड्रॉप मेनू प्रदान करता है। इस तरह की क्षमता आपके सीखने की अवस्था और विकास के समय में काफी तेजी से बढ़ सकती है। –

+2

'सार्वजनिक सार <क्यू AbSuperClass1 > शून्य विधि (क्यू तर्क) बढ़ाता है;' 'सार्वजनिक सार शून्य विधि (AbSuperClass1 तर्क) के बराबर है;'। –

उत्तर

3

ग्रहण इस विधि को जोड़ने का सुझाव:

abstract class AbSuperClass2<K,S, Q extends AbSuperClass1<K,S>> { 
    public abstract void method(Q arg); 
} 

और

class Concrete2 extends AbSuperClass2<String, String, Concrete1> { 
    public void method(Concrete1 arg) { 
     //method definition 
    } 
} 
5

इस कार्यक्रम पर विचार करें:

@Override 
public <Q extends AbSuperClass1<String, String>> void method(Q arg) { 
    // TODO Auto-generated method stub 

} 

एक और बात आप कर सकते हैं, वर्ग के लिए इस प्रकार के पैरामीटर जोड़ने है :

public class OtherConcrete extends AbSuperClass<String, String> {} 

AbSuperClass2<String, String> x = new Concrete2(); 
x.method(new OtherConcrete()); 

आप क्या करने की उम्मीद करेंगे? आप एक विशिष्ट उप प्रकार AbSuperClass<String, String> की के लिए एक कार्यान्वयन प्रदान करने के मामले में विधि अधिरोहित है - लेकिन आप एक कार्यान्वयन जो किसी भीAbSuperClass<String, String> है, जो है क्या आवश्यक है के साथ सामना कर सकते हैं प्रदान नहीं किया है।

स्थिति के ब्योरे को जानने के बिना कार्रवाई के एक विशेष पाठ्यक्रम का सुझाव देना मुश्किल है। Bozho का एक और प्रकार पैरामीटर जोड़ने का सुझाव - आपको method घोषणा को और अधिक विशिष्ट बनाने की इजाजत देता है - एक अच्छा है ... लेकिन पूरी बात बहुत जटिल हो रही है। यदि आप जेनेरिक फंकनेसनेस की मात्रा को कम करने के लिए किसी भी तरह से काम कर सकते हैं, तो आपके कोड रखरखाव शायद इसके लिए आपको धन्यवाद देंगे।

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