"आता एका नवीन, मनोरंजक विषयासाठी: वाइल्डकार्ड्स."

"मूलत:, हे «*» पॅटर्नसारखे काहीतरी आहे जे कोणत्याही गोष्टीशी जुळते."

"पण सुरुवातीपासून सुरुवात करूया."

"कल्पना करा की तुमच्याकडे एक योद्धा वर्ग आहे आणि एक पद्धत आहे जी ठरवते की दोनपैकी कोणता योद्धा अधिक मजबूत आहे. हे कसे दिसेल:"

उदाहरण १
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);

"MagicWarrior आणि ArcherWarrior दोघांनाही वॉरियरचा वारसा मिळाला आहे.. "

"हे थोडे सोपे आहे, परंतु उदाहरणार्थ, ते करेल."

"ठीक आहे."

"आता समजा, ज्या परिस्थितीत अनेक योद्धे मैदानात उतरले आहेत त्यासाठी तुम्ही अशीच पद्धत बनवण्याचा निर्णय घेतला आहे."

उदाहरण १
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> वारसा मिळत नाही . त्यामुळे, तुम्ही ते तिथे पास करू शकत नाही!"

"तुला काय म्हणायचे आहे की तो वारसा घेत नाही?"

"मला हे म्हणायचे आहे: एक सूची आहे आणि दुसरी यादी आहे, परंतु त्यांच्याकडे टाइप पॅरामीटर्स आहेत."

"तुम्ही बरोबर आहात. मला ते लगेच लक्षात आले नाही. तर, या समस्येवर आधीच उपाय आहे का?"

"हो. तुम्हाला अधिक जटिल रचना वापरण्याची आवश्यकता आहे. ते असे दिसते:"

उदाहरण १
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<?>

"त्या दोघांचा अर्थ एकच आहे, म्हणून दुसरी आवृत्ती सहसा वापरली जाते."

"आजसाठी एवढेच."

"धन्यवाद, एली. आज मी खूप काही शिकलो."