সমবায় রিটার্নের ধরন কী?


105

জাভা মধ্যে সমবায় রিটার্ন টাইপ কি? সাধারণভাবে অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিংয়ে?


5
এই ব্লগ পোস্টটি ( ব্লগস.অরাকল.com / সুন্দরারাজন / সেন্ট্রি / )) ব্যাখ্যা করে, কেবল এখানে জ্ঞানের ভিত্তিতে যোগ করে।
আখিল জৈন

@ অখিলজাইন: এই ব্লগ পোস্টটি দুর্দান্ত এবং সহজ। এটি জাভা কীভাবে কোভেরিয়েন্ট রিটার্নের ধরণগুলিকে সমর্থন করে তার জন্য আমি দেখেছি এটিই সবচেয়ে সেরা ব্যাখ্যা।
কেভিনার্পে

@ কেভিনার্প ধন্যবাদ, আমি আনন্দিত যে এটি এত লোকের পক্ষে সহায়ক।
আখিল জৈন

উত্তর:


143

কোভেরিয়েন্ট রিটার্ন, এর অর্থ হ'ল যখন কেউ কোনও পদ্ধতিকে ওভাররাইড করে, তখন ওভাররাইডিং পদ্ধতির রিটার্ন টাইপকে ওভাররাইড পদ্ধতির রিটার্ন টাইপের একটি সাব টাইপ হিসাবে মঞ্জুরি দেওয়া হয়।

একটি উদাহরণ সহ এটি স্পষ্ট করার জন্য, একটি সাধারণ কেস হ'ল Object.clone()- যা এক ধরণের ফেরত দেওয়ার ঘোষণা করা হয় Object। আপনি নিম্নলিখিতটি নিজের ক্লাসে ওভাররাইড করতে পারেন:

public class MyFoo
{

   ...

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

এখানে সুবিধাটি হ'ল যে কোনও পদ্ধতি যা কোনও মাইফু অবজেক্টের স্পষ্ট উল্লেখ রয়েছে clone(), তা প্রত্যাবর্তন মানটি উদাহরণ হিসাবে জানতে (কাস্টিং ছাড়াই) প্রার্থনা করতে এবং জানতে সক্ষম হবে MyFoo। কোভেরিয়েন্ট রিটার্নের ধরণ ছাড়াই মাইফুতে ওভাররাইড হওয়া পদ্ধতিটি ফিরে আসতে ঘোষণা করতে হবে Object- এবং সুতরাং কলিং কোডটি পদ্ধতি কলের ফলাফলকে স্পষ্টভাবে হ্রাস করতে হবে (এমনকি উভয় পক্ষই "জানেন" এটি কেবল মাইফুর উদাহরণ হতে পারে) )।

দ্রষ্টব্য যে এখানে কোনও বিশেষ কিছুই নেই 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()পদ্ধতিটির রিটার্নের ধরণটি সংশোধন করা সম্ভব :DogFoodFood

@Override
protected DogFood seekFood() {

    return new DogFood();
}

এটি পুরোপুরি আইনী ওভাররাইডিং এবং Dogএর seekFood()পদ্ধতির রিটার্নের ধরণটি কোভেরিয়েন্ট রিটার্ন টাইপ হিসাবে পরিচিত ।


8

জেডিকে ২.০ প্রকাশের পর থেকে জাভাতে কোভেরিয়েন্ট প্রকার চালু হয়েছিল। এবং আমি এটি একটি সাধারণ ক্ষেত্রে আপনাকে ব্যাখ্যা করব,: আমরা যখন কোনও ফাংশন ওভাররাইড করি তখন ফাংশনটিকে তার আচরণে পরিবর্তন করার অনুমতি দেওয়া হয় যা আপনি বেশিরভাগ বইয়ে পড়তে পারেন, তবে তারা কী লেখক} মিস করে on আমরা যে রিটার্নের প্রকারটিও পরিবর্তন করতে পারি। স্পষ্টতার জন্য নীচের লিঙ্কটি পরীক্ষা করুন আমরা যতক্ষণ না পদ্ধতির বেস সংস্করণটি ফেরত দেওয়ার জন্য নির্ধারিত হতে পারি ততক্ষণ রিটার্নের ধরণটি পরিবর্তন করতে পারি।

সুতরাং উদ্ভূত প্রকারের ফিরে আসার এই বৈশিষ্ট্যটিকে 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 এর আগে, রিটার্নের ধরণ পরিবর্তন করে কোনও পদ্ধতি ওভাররাইড করা সম্ভব ছিল না। তবে এখন, জাভা 5 থেকে,

সাবক্লাস যদি এমন কোনও পদ্ধতি ওভাররাইড করে যার রিটার্ন টাইপটি নন-প্রিমিটিভ হয় তবে এটি তার রিটার্নের ধরণটি সাবক্লাসের ধরণে পরিবর্তন করে যদি রিটার্নের ধরণের পরিবর্তন করে পদ্ধতিটিকে ওভাররাইড করা সম্ভব হয়।


1
  • এটি শ্রেণিবদ্ধ শ্রেণিতে উপস্থিত বিভ্রান্তিকর জাতের কাস্টগুলি এড়াতে সহায়তা করে এবং এইভাবে কোডটি পাঠযোগ্য, ব্যবহারযোগ্য ও রক্ষণাবেক্ষণযোগ্য করে তুলবে।
  • ওভাররাইডিং
    পদ্ধতিগুলি যখন আমরা আরও সুনির্দিষ্ট রিটার্ন টাইপ আছে একটি স্বাধীনতা পেতে ।

  • রিটার্নগুলিতে রান-টাইম ক্লাসকাস্ট এক্সেক্সশন প্রতিরোধে সহায়তা করুন

তথ্যসূত্র: 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

জাভা 5 এর আগে, রিটার্নের ধরণ পরিবর্তন করে কোনও পদ্ধতি ওভাররাইড করা সম্ভব ছিল না। তবে এখন জাভা ৫-এর পরে, সাবক্লাস যদি এমন কোনও পদ্ধতিকে ওভাররাইড করে যার রিটার্ন টাইপটি নন-প্রিমিটিভ হয় তবে এটি তার রিটার্নের ধরনটি সাবক্লাসের ধরণে পরিবর্তিত করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.