"এখন একটি নতুন, আকর্ষণীয় বিষয়ের জন্য: ওয়াইল্ডকার্ড।"

"মূলত, এটি একটি «*» প্যাটার্নের মতো যা যেকোনো কিছুর সাথে মেলে।"

"তবে শুরু থেকে শুরু করা যাক।"

"কল্পনা করুন যে আপনার একটি ওয়ারিয়র ক্লাস এবং একটি পদ্ধতি যা নির্ধারণ করে যে দুটি যোদ্ধার মধ্যে কোনটি শক্তিশালী। এখানে এটি দেখতে কেমন হতে পারে:"

উদাহরণ 1
class WarriorManager
{
 public static boolean fight(Warrior w1, Warrior w2)
 {
  return w1.power > w2.power;
 }
}
উদাহরণ পদ্ধতি কল
MagicWarrior mag = new MagicWarrior();
ArcherWarrior archer = new ArcherWarrior();

boolean isMagicCooler = WarriorManager.fight(mag, archer);

"ম্যাজিক ওয়ারিয়র এবং আর্চার ওয়ারিয়র উভয়ই ওয়ারিয়রের উত্তরাধিকারী ।।"

"এটি সামান্য সরল, কিন্তু একটি উদাহরণের জন্য, এটি করবে।"

"ঠিক আছে."

"এখন ধরুন আপনি এমন পরিস্থিতির জন্য একই পদ্ধতি তৈরি করার সিদ্ধান্ত নিয়েছেন যেখানে একাধিক যোদ্ধা লড়াইয়ে যোগ দিয়েছে।"

উদাহরণ 1
class WarriorManager
{
 public static boolean fight(Warrior w1, Warrior w2)
 {
  return w1.power > w2.power;
 }

 public static boolean fight(List<Warrior> w1, List<Warrior> w2)
 {
  return 
 }
}
উদাহরণ পদ্ধতি কল
ArrayList<MagicWarrior> magi = new ArrayList<MagicWarrior>();
for(int i = 0; i < 10; i++)
 magi.add(new MagicWarrior());

ArrayList<ArcherWarrior> archers = new ArrayList<ArcherWarrior>();
for(int i = 0; i < 10; i++)
 archers.add(new ArcherWarrior());

boolean isMagicCooler = WarriorManager.fight(magi, archers); // Compilation error!

"কিন্তু এখানে আপনি একটি সংকলন ত্রুটির সম্মুখীন হয়েছেন এবং কী ভুল হতে পারে তা নিয়ে বিভ্রান্ত।"

"বিষয়টি হল ম্যাজিকওয়ারিয়র ওয়ারিয়রকে উত্তরাধিকারসূত্রে পেয়েছে , এবং ম্যাজিকওয়ারিয়র বস্তুগুলিকে যুদ্ধ (ওয়ারিয়র, ওয়ারিয়র) পদ্ধতিতে প্রেরণ করা যেতে পারে।"

"কিন্তু List<MagicWarior> List<Warrior> উত্তরাধিকারী হয় না । সুতরাং, আপনি এটি সেখানে পাস করতে পারবেন না!"

"আপনি কি বলতে চাচ্ছেন এটা উত্তরাধিকারসূত্রে পায় না?"

"আমি এটি বলতে চাচ্ছি: একটি একটি তালিকা এবং অন্যটি একটি তালিকা, তবে তাদের টাইপ প্যারামিটার রয়েছে।"

"তুমি ঠিকই বলেছ। আমি এখনই সেটা খেয়াল করিনি। তাহলে, এই সমস্যার সমাধান কি ইতিমধ্যেই আছে?"

"হ্যাঁ। আপনাকে আরও জটিল কাঠামো ব্যবহার করতে হবে। এটি দেখতে এইরকম:"

উদাহরণ 1
class WarriorManager
{
 public static boolean fight(Warrior w1, Warrior w2)
 {
  return w1.power > w2.power;
 }

 public static boolean fight(List<? extends Warrior> w1, List<? extends Warrior> w2)
 {
  return}
}

""? প্রসারিত ওয়ারিয়র" অংশের অর্থ "যেকোন প্রকার যা উত্তরাধিকার সূত্রে ওয়ারিয়র""

"অন্য কথায়, এখন আপনি একটি তালিকা<MagicWarrior> এবং একটি List<ArcherWarrior> পাস করতে পারেন, এবং সবকিছু কাজ করবে।"

"এটা খুবই অসাধারণ। এই ধরনের সমস্যা যত কম হবে, তত ভালো।"

"আমিও তাই অনুভব করি।"

"কিন্তু যদি আমার এমন কিছুর প্রয়োজন না হয় যা ওয়ারিয়রকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়? আমি যদি পদ্ধতিতে যেকোনো ধরনের প্যারামিটার সহ যেকোনো তালিকা পাস করতে চাই তাহলে কী হবে? এটা কি অনুমোদিত?"

"হ্যাঁ, এটি করার জন্য স্বরলিপির দুটি রূপ রয়েছে:"

List<? extends Object>
List<?>

"তারা উভয়ই একই জিনিস বোঝায়, তাই দ্বিতীয় সংস্করণটি সাধারণত ব্যবহৃত হয়।"

"আজ যে জন্য সব."

"ধন্যবাদ, এলি। আজ আমি সত্যিই অনেক কিছু শিখেছি।"