"হাই, অ্যামিগো!"
"হাই, এলি!"
"আজ, ঋষি এবং আমি আপনাকে জেনেরিক সম্পর্কে সব বলতে যাচ্ছি।"
"অপেক্ষা করুন, আমি মনে করি আমি ইতিমধ্যে প্রায় সবকিছু জানি।"
"প্রায় সবকিছু, কিন্তু সবকিছু নয়।"
"সত্যি? ঠিক আছে, আমি শুনতে প্রস্তুত।"
"তাহলে শুরু করা যাক।"
"জাভাতে, জেনেরিক্স হল ক্লাস যার টাইপ প্যারামিটার আছে।"
"কেন জেনেরিক আবিষ্কার করা হয়েছিল, কোডে মন্তব্যগুলি দেখুন:"
ArrayList stringList = new ArrayList();
stringList.add("abc"); // Add a string to the list
stringList.add("abc"); // Add a string to the list
stringList.add( 1 ); // Add a number to the list
for(Object o: stringList)
{
String s = (String) o; // There will be an exception here when we get to the integer
}
জেনেরিক ব্যবহার করে কীভাবে সমস্যা সমাধান করবেন:
ArrayList<String> stringList = new ArrayList<String>();
stringList.add("abc"); // Add a string to the list
stringList.add("abc"); // Add a string to the list
stringList.add( 1 ); // There will be a compilation error here
for(Object o: stringList)
{
String s = (String) o;
}
"এই কোডটি কেবল কম্পাইল করা হবে না, এবং ভুল ডেটা টাইপ যোগ করার কারণে সৃষ্ট ত্রুটিটি সংকলনের সময় লক্ষ্য করা হবে।"
"হ্যাঁ, আমি ইতিমধ্যে এটি জানি।"
"ঠিক আছে, ভাল। পুনরাবৃত্তি শেখার মা।"
"কিন্তু জাভা-এর নির্মাতারা যখন জেনেরিক তৈরি করেছিলেন তখন তারা একটু অলস ছিলেন। প্যারামিটারের সাথে পূর্ণাঙ্গ ধরনের তৈরি করার পরিবর্তে, তারা একটি চটকদার অপ্টিমাইজেশানে পিছলে গিয়েছিল। বাস্তবে, তারা জেনেরিকগুলিতে টাইপ প্যারামিটার সম্পর্কে কোনও তথ্য যোগ করেনি। পরিবর্তে, সমস্ত যাদু সংকলনের সময় ঘটে।"
List<String> strings = new ArrayList<String>();
strings.add("abc");
strings.add("abc");
strings.add( 1); // Compilation error
for(String s: strings)
{
System.out.println(s);
}
List strings = new ArrayList();
strings.add((String)"abc");
strings.add((String)"abc");
strings.add((String) 1); // Compilation error
for(String s: strings)
{
System.out.println(s);
}
"এটা চটকদার।"
"হ্যাঁ, কিন্তু এই পদ্ধতির একটি পার্শ্বপ্রতিক্রিয়া আছে। টাইপ প্যারামিটার সম্পর্কে কোনো তথ্য জেনেরিক ক্লাসের মধ্যে সংরক্ষণ করা হয় না। এই পদ্ধতিটি পরে টাইপ ইরেজার হিসাবে পরিচিত হয় ।"
"অন্য কথায়, টাইপ প্যারামিটার সহ আপনার নিজের ক্লাস থাকলে, আপনি ক্লাসের ভিতরে সেগুলি সম্পর্কে তথ্য ব্যবহার করতে পারবেন না।"
class Zoo<T>
{
ArrayList<T> pets = new ArrayList<T>();
public T createAnimal()
{
T animal = new T();
pets.add(animal)
return animal;
}
}
class Zoo
{
ArrayList pets = new ArrayList();
public Object createAnimal()
{
Object animal = new ???();
pets.add(animal)
return animal;
}
}
"সংকলনের সময়, সমস্ত পরামিতি প্রকারকে অবজেক্ট দিয়ে প্রতিস্থাপিত করা হয়। এবং ক্লাসের ভিতরে এটিতে পাস করা টাইপ সম্পর্কে কোনও তথ্য নেই।"
"হ্যাঁ, আমি একমত, এটি সেরা নয়।"
"এটা তেমন ভীতিকর নয়। আমি আপনাকে পরে বলব কিভাবে এই সমস্যা থেকে মুক্তি পাওয়া যায়।"
কিন্তু আরো আছে. জাভা আপনাকে টাইপ প্যারামিটারের জন্য একটি প্যারেন্ট টাইপ নির্দিষ্ট করতে দেয়। এর জন্য এক্সটেন্ডস কীওয়ার্ড ব্যবহার করা হয়। উদাহরণ স্বরূপ:
class Zoo<T extends Cat>
{
T cat;
T getCat()
{
return cat;
}
void setCat (T cat)
{
this.cat = cat;
}
String getCatName()
{
return this.cat.getName();
}
}
class Zoo
{
Cat cat;
Cat getCat()
{
return cat;
}
void setCat(Cat cat)
{
this.cat = cat;
}
String getCatName()
{
return this.cat.getName();
}
}
"দুটি তথ্য নোট করুন:"
"প্রথম, আপনি প্যারামিটার হিসাবে কোনও প্রকার পাস করতে পারবেন না - আপনি কেবল একটি বিড়াল বা বিড়ালের উত্তরাধিকারী একটি ক্লাস পাস করতে পারেন।"
"দ্বিতীয়, চিড়িয়াখানা ক্লাসের অভ্যন্তরে, T টাইপের ভেরিয়েবলগুলি এখন ক্যাট ক্লাসের পদ্ধতিগুলিকে কল করতে পারে৷ ডানদিকের কলামটি ব্যাখ্যা করে কেন (কারণ যেখানে একটি টি আছে সেখানে বিড়াল প্রতিস্থাপিত হবে)"
"হ্যাঁ। যদি আমরা বলি যে Cat বা Cat-এর একটি সাবক্লাস টাইপ আর্গুমেন্ট হিসাবে পাস করা হয়েছে, তাহলে আমরা নিশ্চিত যে T টাইপ সবসময়ই Cat ক্লাসের পদ্ধতি থাকবে।"
"ওয়েল, এটা চালাক।"
GO TO FULL VERSION