Vivasoft-logo

১০.৪ ক্লাসে জেনেরিক (Generics in classes)

১০.4.১ জেনেরিক টাইপ প্যারামিটার সহ ক্লাস তৈরি করা

আমরা ক্লাস-স্কোপড টাইপ প্যারামিটার-ও ঘোষণা করতে পারি, এবং এটিকে পুরো ক্লাসের মধ্যে সার্বজনীনভাবে ব্যবহার করতে পারি, মানে, মেথডগুলির মধ্যে এবং সদস্য ভেরিয়েবল হিসেবে-ও ব্যবহার করতে পারি। উদাহরণস্বরূপ, এটি একটি বৈধ শ্রেণীর সংজ্ঞা।

class GenericClass {
    // a member field of type T (first type param)
    final T genericField;

    GenericClass(this.genericField);

    O methodName(I input){
        ...
        return instance_of_O;
    }
}
 

এখানে, আমাদের 3 প্রকারের প্যারামিটার আছে, T, I এবং O।

ক্লাসের মধ্যে, আমাদের genericField নামে একটি মেম্বার ভ্যারিয়েবল রয়েছে যা T টাইপের। আমরা এটিকে ক্লাস কনস্ট্রাক্টরের একটি প্যারামিটার হিসাবে সরবরাহ করেছি।দ্বিতীয়ত, আমাদের methodName নামে একটি পদ্ধতি রয়েছে যা T টাইপের একটি প্যারামিটার নেয় এবং টাইপ O-এর একটি উদাহরণ প্রদান করে।

যদি আমরা এই ক্লাসের একটি উদাহরণ তৈরি করতে চাই, আমরা এইরকম কিছু করব: GenericClass clazz = GenericClass(“A string”);

যদি কোন কারণে, আমরা লিখি GenericClass clazz = GenericClass(1234); , আমরা একটি কম্পাইল টাইম ত্রুটি পাব। আমাদের চুক্তি প্রোগ্রামকে বলেছিল যে কনস্ট্রাক্টর স্ট্রিং গ্রহণ করবে, কিন্তু এখানে আমরা এটিকে একটি পূর্ণসংখ্যা দিচ্ছি।

কিন্তু আমরা যদি লিখি GenericClass clazz = GenericClass(1234); ত্রুটিটি চলে যাবে, কারণ আমরা কনস্ট্রাক্টরকে যা আশা করে তা-ই দিয়েছি।অন্যদিকে, আমরা এই ক্লাসের একমাত্র মেথডকে (অর্থাৎ, methodName) এভাবে ব্যবহার করব : clazz.methodName(123);

যদি আমরা মেথডকে এভাবে কল করার চেষ্টা করি: clazz.methodName(“A string”); আমরা একটি কম্পাইল টাইম ত্রুটি পাব, কারণ চুক্তি অনুযায়ী, আমরা এটিকে একটি পূর্ণসংখ্যা (দ্বিতীয় টাইপ প্যারামিটার) পাঠাতে চেয়েছিলাম।

একইভাবে, চুক্তি অনুসারে, আমাদের এই মেথড (তৃতীয় টাইপ প্যারামিটার) থেকে একটি ডাবল ফেরত দিতে হবে।

এই নিয়মগুলি পূর্ববর্তী বিভাগের বিষয়বস্তুর ক্ষেত্রেও প্রযোজ্য (১০.৩)৷