2009-12-10 12 views
75

जावा में एक कॉन्वर्स रिटर्न प्रकार क्या है? सामान्य रूप से ऑब्जेक्ट उन्मुख प्रोग्रामिंग में?एक कॉन्वेंट रिटर्न प्रकार क्या है?

+4

इस ब्लॉग पोस्ट (https://blogs.oracle.com/sundararajan/entry/covariant_return_types_in_java) बताते हैं, बस यहां ज्ञान आधार को जोड़ना। –

+0

@ अखिलजैन: वह ब्लॉग पोस्ट शानदार और सरल है। यह सबसे अच्छा स्पष्टीकरण-उदाहरण है, मैंने कभी देखा है कि जावा कैसे कॉन्वर्स रिटर्न प्रकारों का समर्थन करता है। – kevinarpe

+0

@kevinarpe धन्यवाद, मुझे खुशी है कि यह बहुत से लोगों के लिए सहायक है। –

उत्तर

107

कोविरिएंट रिटर्न, इसका मतलब है कि जब कोई एक विधि ओवरराइड करता है, ओवरराइडिंग विधि के रिटर्न प्रकार को ओवरराइड विधि के रिटर्न प्रकार का उप-प्रकार होने की अनुमति दी जाती है।

उदाहरण के साथ इसे स्पष्ट करने के लिए, एक सामान्य मामला Object.clone() है - जिसे Object का एक प्रकार वापस करने के लिए घोषित किया गया है। इस प्रकार आप अपनी खुद की कक्षा में इस रद्द कर सकते थे:

public class MyFoo 
{ 

    ... 

    // Note covariant return here, method does not just return Object 
    public MyFoo clone() 
    { 
     // Implementation 
    } 
} 

लाभ यहाँ है कि किसी भी विधि है जो एक MyFoo वस्तु के लिए एक स्पष्ट संदर्भ रखती clone() आह्वान करने में सक्षम हो और (कास्टिंग) के बिना पता चल जाएगा है कि वापसी मान MyFoo का एक उदाहरण है। कॉन्विएन्ट रिटर्न प्रकारों के बिना, माईफू में ओवरराइड विधि को Object वापस करने के लिए घोषित किया जाना होगा - और इसलिए कॉलिंग कोड को विधि कॉल के परिणाम को स्पष्ट रूप से डाउनकास्ट करना होगा (यहां तक ​​कि दोनों पक्षों को "पता" माना जाता है कि यह केवल एक उदाहरण हो सकता है MyFoo)।

ध्यान दें कि clone() के बारे में विशेष कुछ भी नहीं है और किसी भी ओवरराइड विधि में एक कॉन्वेंट रिटर्न हो सकता है - मैंने इसे यहां एक उदाहरण के रूप में उपयोग किया क्योंकि यह एक मानक विधि है जहां यह अक्सर उपयोगी होता है।

+0

क्या यह 'सूची ' और 'सूची ' से संबंधित नहीं है? – zinking

+2

यह कॉन्वेंरिएंट प्रकारों की तुलना में व्यापक रूप से कॉन्वेंट प्रकार है ** वापसी ** प्रकार यहां पूछा गया है। यह वही अंतर्निहित सिद्धांत है, हालांकि - आप 'क्लोन()' की शीर्ष-स्तरीय परिभाषा को 'विधि <शून्य, ऑब्जेक्ट>' के रूप में सोच सकते हैं और पूछ सकते हैं कि अधिक विशिष्ट 'विधि ' उस के लिए असाइन किया जा सकता है या नहीं माता-पिता का प्रकार यह कौन सा है, अगर और केवल जावा विधियां उनके रिटर्न प्रकार में कॉन्वर्सेंट हैं। –

5

जेडीके 1.5 की रिहाई से, जावा में कॉन्वेंट प्रकारों को पेश किया गया था। और मैं आपको एक साधारण मामले के साथ समझाऊंगा: जब हम किसी फ़ंक्शन को ओवरराइड करते हैं तो फ़ंक्शन को इसके व्यवहार में परिवर्तन करने की अनुमति है जो आपको अधिकांश पुस्तकों में पढ़ने के लिए मिलता है, लेकिन वे क्या {लेखक] याद करते हैं बाहर यह है कि हम रिटर्न प्रकार भी बदल सकते हैं। स्पष्टीकरण के लिए नीचे दिए गए लिंक की जांच करें, हम तब तक वापसी प्रकार बदल सकते हैं जब तक कि इसे विधि के बेस संस्करण के प्रकार को वापस करने के लिए असाइन किया जा सके।

तो व्युत्पन्न प्रकार लौटने की इस सुविधा covariant कहा जाता है ...

Can overridden methods differ in return type?

27

यहाँ एक और सरल उदाहरण है:

Animal वर्ग

public class Animal { 

    protected Food seekFood() { 

     return new Food(); 
    } 
} 

Dog वर्ग

public class Dog extends Animal { 

    @Override 
    protected Food seekFood() { 

     return new DogFood(); 
    } 
} 

यह संभव Dog की वापसी प्रकार संशोधित करने के लिए है 'DogFood को रों seekFood() विधि - Food का एक उपवर्ग, जिन्हें आप नीचे:

@Override 
protected DogFood seekFood() { 

    return new DogFood(); 
} 

पूरी तरह से एक कानूनी अधिभावी है यही कारण है, और Dog की वापसी प्रकार' एस seekFood() विधि कोविरिएंट रिटर्न प्रकार के रूप में जाना जाता है।

3

कॉन्वेंट रिटर्न प्रकार का मतलब है कि अपने क्लास संदर्भ या उसके बाल वर्ग संदर्भ को वापस करना है। वर्ग जनक { // यह डेटा सदस्य और डेटा विधि शामिल }

class Child extends Parent 
{ 
//it contain data member and data method 
//covariant return 
public Parent methodName() 
    { 
    return new Parent(); 
      or 
     return Child(); 
    } 

} 
0
  • जावा में covariant वापसी प्रकार, ओवरराइड विधि की वापसी प्रकार संख्या कम की अनुमति देता है।
  • यह सुविधा क्लाइंट साइड पर कास्टिंग करने से बचने में मदद करेगी। यह प्रोग्रामर को प्रकार की जांच और डाउन कास्टिंग के बिना प्रोग्राम करने की अनुमति देता है।
  • कॉन्वर्सट रिटर्न प्रकार हमेशा केवल गैर-आदिम रिटर्न प्रकारों के लिए काम करता है।
interface Interviewer { 
    default Object submitInterviewStatus() { 
     System.out.println("Interviewer:Accept"); 
     return "Interviewer:Accept"; 
    } 
} 
class Manager implements Interviewer { 
    @Override 
    public String submitInterviewStatus() { 
     System.out.println("Manager:Accept"); 
     return "Manager:Accept"; 
    } 
} 
class Project { 
    public static void main(String args[]) { 
     Interviewer interviewer = new Manager(); 
     interviewer.submitInterviewStatus(); 
     Manager mgr = new Manager(); 
     mgr.submitInterviewStatus(); 
    } 
} 

अन्य उदाहरण,

जावा से है UnaryOperator.java

@FunctionalInterface 
public interface UnaryOperator<T> extends Function<T, T> { 

    /** 
    * Returns a unary operator that always returns its input argument. 
    * 
    * @param <T> the type of the input and output of the operator 
    * @return a unary operator that always returns its input argument 
    */ 
    static <T> UnaryOperator<T> identity() { 
     return t -> t; 
    } 
} 

Function.java

@FunctionalInterface 
public interface Function<T, R> { 

    ........ 
    ........ 
    ........ 
    ........ 

    static <T> Function<T, T> identity() { 
     return t -> t; 
    } 
} 
0

covariant वापसी प्रकार निर्दिष्ट करता है कि वापसी प्रकार जावा 5 से पहले उपवर्ग

class One{ 
    One get(){return this;} 
} 

class Two extends One{ 
    Two get(){return this;} 

void message(){ 
    System.out.println("After Java5 welcome to covariant return type"); 
} 

public static void main(String args[]){ 
    new Two().get().message(); 
} 
} 

के रूप में एक ही दिशा में भिन्न हो सकते हैं, यह संभव ओवरराइड वापसी प्रकार बदल कर कोई भी तरीका नहीं था। लेकिन अब, Java5 के बाद से,

यह संभव वापसी प्रकार बदलते उपवर्ग किसी भी विधि जिसका वापसी प्रकार गैर आदिम है लेकिन यह अपनी वापसी प्रकार में परिवर्तन प्रकार उपवर्ग को ओवरराइड करता है, तो द्वारा विधि ओवरराइड करने के लिए है।

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