एक सहसंयोजक वापसी प्रकार क्या है?


105

जावा में सहसंयोजक वापसी प्रकार क्या है? सामान्य रूप से ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में?


5
यह ब्लॉग पोस्ट ( blogs.oracle.com/sundararajan/entry/… ) बताती है, बस ज्ञान के आधार को यहाँ जोड़ा जा रहा है।
अखिल जैन

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

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

जवाबों:


143

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

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

public class MyFoo
{

   ...

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

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

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


इसके साथ संबंधित होना चाहिए नहीं है List<Foo>और List<FooBar>?
zinking

2
यहाँ के बारे में पूछे जाने वाले कोवरिएंट रिटर्न प्रकार के बजाय यह व्यापक अर्थ में सहसंयोजक प्रकार हैं। यह एक ही अंतर्निहित सिद्धांत है, हालांकि - आप clone()एक होने के रूप में शीर्ष-स्तरीय परिभाषा के बारे में सोच सकते हैं Method<Void, Object>, और पूछ सकते हैं कि क्या Method<Void, MyFoo>उस मूल प्रकार के लिए अधिक विशिष्ट असाइन किया गया है। जो यह है, अगर और केवल अगर जावा विधियाँ उनके वापसी प्रकार में सहसंयोजक हैं।
आंद्रेज डोयले

38

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

Animal कक्षा

public class Animal {

    protected Food seekFood() {

        return new Food();
    }
}

Dog कक्षा

public class Dog extends Animal {

    @Override
    protected Food seekFood() {

        return new DogFood();
    }
}

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

@Override
protected DogFood seekFood() {

    return new DogFood();
}

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


8

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

तो व्युत्पन्न प्रकारों की वापसी की इस विशेषता को COVARIANT कहा जाता है ...

क्या ओवरराइड विधियां रिटर्न प्रकार में भिन्न हो सकती हैं?


7

सहसंयोजक वापसी प्रकार का अर्थ है केवल स्वयं का क्लास संदर्भ या उसका चाइल्ड क्लास संदर्भ वापस करना।

class Parent {
 //it contain data member and data method
}

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

}

1
यह भी इस मामले में जहां भी शामिल Parent.foo()रिटर्न एक असंबंधित प्रकार Aऔर Child.foo()रिटर्न एक प्रकार Bसे ली गई A
डेविस हेरिंग

2

उपरोक्त उत्तरों को जोड़ने के लिए, सह-प्रकार के रिटर्न प्रकारों के बीच ओवरराइडिंग संभव है, बाधा के साथ कि ओवरराइडिंग विधि (उपवर्ग विधि) का वापसी प्रकार ओवरराइड विधि (सुपरक्लास विधि) के वापसी प्रकार का एक उपवर्ग होना चाहिए। यह जावा 5 से मान्य है।


1

सहसंयोजक वापसी प्रकार निर्दिष्ट करता है कि वापसी प्रकार उपवर्ग के समान दिशा में भिन्न हो सकता है

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();  
}  
}

जावा 5 से पहले, रिटर्न प्रकार को बदलकर किसी भी विधि को ओवरराइड करना संभव नहीं था। लेकिन अब, Java5 के बाद से,

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


1
  • यह वर्ग पदानुक्रम में मौजूद भ्रामक प्रकार के कलाकारों से बचने में मदद करता है और इस प्रकार कोड को पठनीय, प्रयोग करने योग्य और बनाए रखने योग्य बनाता है।
  • जब हम
    तरीकों को ओवरराइड करते हैं तो हमें अधिक विशिष्ट रिटर्न प्रकार प्राप्त करने की स्वतंत्रता मिलती है ।

  • रिटर्न पर रन-टाइम ClassCastException को रोकने में मदद करें

संदर्भ: www.geeksforgeeks.org


0
  • जावा में सहसंयोजक वापसी प्रकार, ओवरराइड विधि की वापसी प्रकार को कम करने की अनुमति देता है।
  • यह सुविधा क्लाइंट साइड पर डाउन कास्टिंग से बचने में मदद करेगी। यह प्रोग्रामर को टाइप चेकिंग और डाउन कास्टिंग की आवश्यकता के बिना प्रोग्राम करने की अनुमति देता है।
  • सहसंयोजक वापसी प्रकार हमेशा गैर-आदिम वापसी प्रकारों के लिए ही काम करता है।
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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.