2011-06-23 20 views
14

का रिटर्न प्रकार होने पर मैं एक सेट अप बनाने की कोशिश कर रहा हूं जहां उप-वर्गों का एक सेट सुपरक्लास को ओवरराइड करता है। इस सुपर क्लास एक सार विधि शामिल हैं - वापसी प्रकार जिनमें से आदर्श वस्तु है जहाँ से इस विधि बुलाया गया था, ऐसी है कि वह प्रभावी रूप से इस तरह बर्ताव करता है की है कि होगा:जावा जेनेरिक - एक अमूर्त विधि को ओवरराइड करना और सबक्लास

public abstract class SuperClass{ 
    public abstract SuperClass getSelf(); 
} 

public class SubClass extends SuperClass{ 
    @Override 
    public SubClass getSelf(){ 
    return this; 
    } 
} 

मैं अनिश्चित हूं अगर ऐसी बात संभव है , के रूप में मुझे लगता है कि वापसी प्रकार हमेशा काम करने के लिए ओवरराइड के लिए क्रम में ही होना आवश्यक -, फिर भी मैं इस सवाल का जवाब सोच कर दिया गया है एक मौजूद होना चाहिए, इस रेखा के साथ कहीं न कहीं होते रहते हैं ...

public abstract class SuperClass{ 
    public abstract <? extends SuperClass> getSelf(); 
} 

public class SubClass extends SuperClass{ 
    @Override 
    public SubClass getSelf(){ 
    return this; 
    } 
} 

किसी भी के लिए धन्यवाद मदद।

संपादित करें: जोड़ा उपवर्ग के लिए सुपर क्लास फैली हुई है,

+0

मुझे नहीं पता कि आप इसका उपयोग कैसे करेंगे। क्या आप मुझे एक उदाहरण दे सकते हैं? –

उत्तर

7

ओह यह काम करेगा:

public abstract class SuperClass{ 
    public abstract SuperClass getSelf(); 
} 

public class SubClass extends SuperClass{ 
    @Override 
    public SubClass getSelf(){ 
    return this; 
    } 
} 

सूचना मैं अपने SubClass परिभाषा को extends SuperClass जोड़ दिया है। getSelf का वापसी प्रकार covariant return type के रूप में जाना जाता है।

+0

आह, निश्चित रूप से मैं उदाहरण में सुपरक्लास को विस्तारित करना भूल गया था, हालांकि यह निश्चित रूप से मेरे कोड में मौजूद है ... उसने कहा, मैं पूरी तरह से अनजान था कि यह पहले से ही काम करता है, धन्यवाद! – Numeron

+1

यह मेरे लिए काम नहीं करता है :( – Carlos

4

इस बारे में कैसे:

public abstract class SuperClass<T extends SuperClass<?>> { 
    public abstract T getSelf(); 
} 

public class SubClass extends SuperClass<SubClass> { 
    public SubClass getSelf() { 
     return this; 
    } 
} 

मैं जानता हूँ कि यह काफी दोहराव है और कुछ भी नहीं प्रकार सीमाएं, एक ही SubClass उदाहरण हो सकता है क्योंकि यह भी AnotherSubClass बाध्य संतुष्ट हैं, लेकिन कम से कम यह चाल करना चाहिए।

2

यहां यह कैसे करना है (चूंकि जेडीके 1.5 के बाद इस बात को कॉन्वेंट रिटर्न प्रकार कहा जाता है, जहां ऐसा कुछ संभव है)।

abstract class SuperClass<T extends SuperClass<T>>{ 
    public abstract T getSelf(); 
} 

class SubClass extends SuperClass<SubClass> { 
    public SubClass getSelf() { return this; } 
} 

public class Generics { 
    public static void main(String[] args) { 
    System.out.println(new SubClass().getSelf()); 
    } 
} 

सूचना Enum के साथ एक समान वर्ग सामान्य परिभाषा (http://download.oracle.com/javase/1,5.0/docs/api/java/lang/Enum.html)

देखें क्या पर्दे के पीछे क्या होता है (का उपयोग करके javap सुपर क्लास उपवर्ग):

class SubClass extends SuperClass{ 
    SubClass(); 
    public SubClass getSelf(); 
    public SuperClass getSelf(); 
} 

abstract class SuperClass extends java.lang.Object{ 
    SuperClass(); 
    public abstract SuperClass getSelf(); 
} 

सूचना कैसे उपवर्ग विधि का एक अलग वापसी प्रकार है, जो सुपर विधि वापसी प्रकार की एक उप-प्रकार है।

बीटीडब्ल्यू, ध्यान दें कि public SuperClass getSelf(); कक्षा SubClass में वास्तव में सिंथेटिक विधि है।

+0

परिणाम !!!!!! +1 –

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