"अब एक नए, दिलचस्प विषय के लिए: वाइल्डकार्ड।"

"अनिवार्य रूप से, यह एक «*» पैटर्न जैसा कुछ है जो किसी भी चीज़ से मेल खाता है।"

"लेकिन चलो शुरू से शुरू करते हैं।"

"कल्पना कीजिए कि आपके पास एक योद्धा वर्ग है और एक तरीका है जो यह निर्धारित करता है कि कौन से दो योद्धा अधिक मजबूत हैं। यहां बताया गया है कि यह कैसा दिख सकता है:"

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

"लेकिन यहाँ आप एक संकलन त्रुटि का सामना करते हैं और हैरान हैं कि क्या गलत हो सकता है।"

"बात यह है कि MagicWarrior को योद्धा विरासत में मिला है , और MagicWarrior वस्तुओं को लड़ाई (योद्धा, योद्धा) विधि में पारित किया जा सकता है।"

"लेकिन लिस्ट <मैजिक वॉरियर> लिस्ट <वारियर> इनहेरिट नहीं करता है । इसलिए, आप इसे वहां पास नहीं कर सकते!"

"आपका क्या मतलब है कि यह इसे विरासत में नहीं मिला है?"

"मेरा यह मतलब है: एक सूची है और दूसरी सूची है, लेकिन उनके पास प्रकार के पैरामीटर हैं।"

"आप सही कह रहे हैं। मैंने किसी तरह तुरंत इस पर ध्यान नहीं दिया। तो, क्या इस समस्या का पहले से ही कोई समाधान है?"

"हाँ। आपको एक अधिक जटिल संरचना का उपयोग करने की आवश्यकता है। यह ऐसा दिखता है:"

उदाहरण 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> और एक सूची <ArcherWarrior> पास कर सकते हैं, और सब कुछ काम करेगा।"

"यह बहुत बढ़िया है। ऐसी समस्याएं जितनी कम हों, उतना अच्छा है।"

"ऐसा मुझे भी लगता है।"

"लेकिन क्या होगा अगर मुझे ऐसी किसी चीज़ की ज़रूरत नहीं है जो वारियर को विरासत में मिली हो? क्या होगा अगर मैं विधि के किसी भी प्रकार के पैरामीटर के साथ किसी भी सूची को पारित करने में सक्षम होना चाहता हूं? क्या इसकी अनुमति है?"

"हाँ, ऐसा करने के लिए संकेतन के दो रूप हैं:"

List<? extends Object>
List<?>

"वे दोनों का मतलब एक ही है, इसलिए आमतौर पर दूसरे संस्करण का उपयोग किया जाता है।"

"यह सभी आज के लिए है।"

"धन्यवाद, ऐली। मैंने आज वास्तव में बहुत कुछ सीखा।"