"হাই! আমি জেনেরিক বিষয়ে এলির পাঠ চালিয়ে যাচ্ছি। শুনতে প্রস্তুত?"

"হ্যাঁ."

"তাহলে শুরু করা যাক।"

"প্রথম জিনিসটি আপনাকে জানতে হবে যে একটি ক্লাসের পদ্ধতিতে তাদের নিজস্ব টাইপ প্যারামিটার থাকতে পারে।"

"আমি জানি."

"না, আমি বিশেষভাবে তাদের নিজস্ব ধরনের পরামিতি বোঝাতে চাই: "

উদাহরণ
class Calculator
{
  T add(T a, T b); // Add
  T sub(T a, T b); // Subtract
  T mul(T a, T b); // Multiply
  T div(T a, T b); // Divide
}

"এই ধরনের পরামিতিগুলি বিশেষভাবে পদ্ধতিগুলির সাথে সম্পর্কিত। ক্লাসের পরামিতি নেই। আপনি এমনকি এই পদ্ধতিগুলিকে স্ট্যাটিক ঘোষণা করতে পারেন এবং কোনও বস্তু ছাড়াই তাদের কল করতে পারেন।"

"আমি দেখতে পাচ্ছি। পদ্ধতিতে টাইপ প্যারামিটারের পয়েন্ট ক্লাসের মতই?"

"হ্যাঁ। তবে নতুন কিছু আছে।"

"আপনি ইতিমধ্যেই জানেন, আপনি টাইপ ঘোষণায় একটি ওয়াইল্ডকার্ড ব্যবহার করতে পারেন। তারপর নিম্নলিখিত পরিস্থিতিটি কল্পনা করুন:"

উদাহরণ 1
public void doSomething(List<? extends MyClass> list)
{
 for(MyClass object : list)
 {
  System.out.println(object.getState()); // Everything works well here.
 }
}

"কিন্তু যদি আমরা সংগ্রহে একটি নতুন আইটেম যোগ করতে চাই:"

উদাহরণ 2
public void doSomething(List<? extends MyClass> list)
{
 list.add(new MyClass()); // Error!
}

"সমস্যা হল যে সাধারণ ক্ষেত্রে doSomething পদ্ধতিটি এমন একটি তালিকা পাস করতে পারে যার উপাদানগুলি MyClass অবজেক্ট নয়, বরং MyClass-এর যেকোনো সাবক্লাসের অবজেক্ট। কিন্তু আপনি এই ধরনের তালিকায় MyClass অবজেক্ট যোগ করতে পারবেন না!"

"আহ. তাই, এটা সম্পর্কে কি করা যেতে পারে?"

"কিছুই না। এই অবস্থায়, আপনি কিছুই করতে পারবেন না। কিন্তু এটি জাভার নির্মাতাদের চিন্তা করার মতো কিছু দিয়েছে। এবং তারা একটি নতুন কীওয়ার্ড নিয়ে এসেছে: সুপার ।"

"সিনট্যাক্স প্রায় একই দেখায়:"

List<? super MyClass> list

কিন্তু প্রসারিত এবং সুপার মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য আছে.

"«? T প্রসারিত করে» মানে যে শ্রেণীটি অবশ্যই T-এর বংশধর হতে হবে।"

"«? সুপার T» মানে যে শ্রেণীটি অবশ্যই T-এর পূর্বপুরুষ হতে হবে।"

"পবিত্র মলি। তাহলে এটা কোথায় ব্যবহার করা হয়?"

"«? সুপার T» ব্যবহার করা হয় যখন কোনো পদ্ধতিতে T বস্তুর সংগ্রহ যোগ করা হয়। এই ক্ষেত্রে, এটি T বস্তুর সংগ্রহ বা T-এর কোনো পূর্বপুরুষ হতে পারে।"

"আহ. AT অবজেক্ট একটি রেফারেন্স ভেরিয়েবলের জন্য বরাদ্দ করা যেতে পারে যার ধরনটি T-এর পূর্বপুরুষদের মধ্যে একটি"

"সত্যি বলতে, এই পদ্ধতিটি প্রায়শই ব্যবহার করা হয় না। আরও কী, এর একটি ঘাটতি রয়েছে। উদাহরণস্বরূপ:"

উদাহরণ
public void doSomething(List<? super MyClass> list)
{
 for(MyClass object : list) // Error!
 {
  System.out.println(object.getState());
 }
}
public void doSomething(List<? super MyClass> list)
{
 list.add(new MyClass()); // Everything works well here.
}

"এখন প্রথম উদাহরণ কাজ করে না।"

"যেহেতু তালিকাটি একটি List<Object> হতে পারে (বস্তু হল MyClass-এর শীর্ষস্থানীয় সুপারক্লাস), আমরা মূলত নিম্নলিখিত অবৈধ কোডটি লিখছি:"

উদাহরণ 1
List<Object> list; 

for(MyClass object : list) // Error!
{ 
 System.out.println(object.getState()); 
}

"আমি দেখছি। আকর্ষণীয় পাঠের জন্য ধন্যবাদ।"

"আপনাকে স্বাগতম."