निचली सीमा वाले Wildcards
उपभोक्ताओं के लिए ? super T
निचली सीमा वाले Wildcards, CoddyKit पर Java Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Java Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
निचली सीमा वाला वाइल्डकार्ड
? super T एक निचली सीमा वाला वाइल्डकार्ड है। इसका अर्थ है "T या T के किसी महाप्रकार का कोई अज्ञात प्रकार"।
List<? super Integer> किसी List<Integer>, List<Number> या List<Object> को संदर्भित कर सकती है।
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<? super Integer> a = new ArrayList<Number>();
List<? super Integer> b = new ArrayList<Object>();
a.add(1);
b.add(2);
System.out.println(a + " " + b);
}
}उपभोक्ता में लिखना
? super Integer के साथ आप किसी भी Integer (या Integer के उपप्रकार) को सुरक्षित रूप से जोड़ सकते हैं।
वास्तविक सूची का प्रकार जो भी हो, वह कम-से-कम Integer के किसी महाप्रकार की सूची है, इसलिए Integer उसमें हमेशा फिट होगा।
import java.util.ArrayList;
import java.util.List;
public class Main {
static void addNumbers(List<? super Integer> dest) {
for (int i = 1; i <= 3; i++) dest.add(i);
}
public static void main(String[] args) {
List<Number> nums = new ArrayList<>();
addNumbers(nums);
System.out.println(nums);
}
}पढ़ने पर Object मिलता है
इसका समझौता यह है कि जब आप ? super T वाली सूची से पढ़ते हैं, तो कंपाइलर केवल इतना जानता है कि तत्व T के किसी अज्ञात महाप्रकार के हैं।
पढ़ने के लिए एकमात्र सुरक्षित प्रकार Object है।
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<? super Integer> list = new ArrayList<Number>();
list.add(10);
Object o = list.get(0); // only Object is guaranteed
// Integer i = list.get(0); // would NOT compile
System.out.println(o);
}
}पढ़ना सीमित क्यों है
List<? super Integer> वास्तव में List<Object> हो सकती है, जिसमें String रखे गए हों।
इसलिए पढ़ने पर कोई भी Object मिल सकता है। कंपाइलर Integer होने की गारंटी नहीं दे सकता, इसलिए पढ़ने पर केवल Object मिलता है।
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Object> raw = new ArrayList<>();
raw.add("a string");
List<? super Integer> view = raw; // legal: Object is a supertype of Integer
view.add(5);
System.out.println(view.get(0).getClass().getSimpleName());
}
}उपभोक्ता का उपयोग-प्रकरण
जब कोई विधि केवल मानों को ग्रहण करती है (अंदर लिखती है), तब ? super T का उपयोग कीजिए।
गंतव्य संग्रह को भरने वाली विधि इसका पारंपरिक उदाहरण है।
import java.util.ArrayList;
import java.util.List;
public class Main {
static void fill(List<? super String> dest, int count) {
for (int i = 0; i < count; i++) dest.add("item" + i);
}
public static void main(String[] args) {
List<Object> objs = new ArrayList<>();
fill(objs, 3);
System.out.println(objs);
}
}उपप्रकार जोड़ना भी संभव है
? super Number के साथ आप किसी भी Number या उसके उपप्रकार को जोड़ सकते हैं: Integer, Double, Long।
निचली सीमा यह सुनिश्चित करती है कि सूची कम-से-कम Number स्वीकार करती है, इसलिए उसके सभी उपप्रकार भी फिट हो जाते हैं।
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<? super Number> list = new ArrayList<Object>();
list.add(1); // Integer
list.add(2.5); // Double
list.add(3L); // Long
System.out.println(list);
}
}Collections.addAll की शैली
JDK में sink के लिए निचली सीमाओं का उपयोग किया जाता है। उदाहरण के लिए, ऐसी जेनेरिक विधि जो तत्वों को किसी गंतव्य में डालती है।
import java.util.ArrayList;
import java.util.List;
public class Main {
@SafeVarargs
static <T> void addAll(List<? super T> dest, T... items) {
for (T item : items) dest.add(item);
}
public static void main(String[] args) {
List<Object> sink = new ArrayList<>();
addAll(sink, "a", "b", "c");
System.out.println(sink);
}
}super के साथ तुलना-कर्ता
वास्तविक उपयोग का एक उदाहरण: Comparator<? super T> किसी sort को महाप्रकार के लिए लिखे गए तुलना-कर्ता को स्वीकार करने देता है।
किसी भी Object की toString द्वारा तुलना करने वाला तुलना-कर्ता String की सूची को sort कर सकता है।
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class Main {
public static void main(String[] args) {
Comparator<Object> byString = Comparator.comparing(Object::toString);
List<String> names = new ArrayList<>(List.of("Charlie", "Alice", "Bob"));
names.sort(byString); // List<String>.sort accepts Comparator<? super String>
System.out.println(names);
}
}super और extends एक-दूसरे के प्रतिबिंब हैं
दोनों वाइल्डकार्ड एक-दूसरे के विपरीत हैं:
? extends T: T को पढ़ें, लिख नहीं सकते। यह उत्पादक है।? super T: T को लिखें, केवल Object पढ़ें। यह उपभोक्ता है।
यह समरूपता PECS नियम का आधार है, जिसे आप अगले भाग में सीखेंगे।
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<? super Integer> consumer = new ArrayList<Number>();
consumer.add(1);
System.out.println("consumer can write: " + consumer);
}
}सीमाओं के बीच कॉपी करना
एक copy विधि दोनों वाइल्डकार्ड एक साथ दिखाती है: ? extends T से पढ़ना और ? super T में लिखना।
import java.util.ArrayList;
import java.util.List;
public class Main {
static <T> void copy(List<? extends T> src, List<? super T> dest) {
for (T t : src) dest.add(t);
}
public static void main(String[] args) {
List<Integer> src = List.of(1, 2, 3);
List<Number> dest = new ArrayList<>();
copy(src, dest);
System.out.println(dest);
}
}वाइल्डकार्ड का उपयोग कब न करें
यदि कोई विधि T को पढ़ती और लिखती दोनों है, तो वाइल्डकार्ड का उपयोग न करें। सटीक प्रकार या नामित प्रकार पैरामीटर का उपयोग कीजिए।
वाइल्डकार्ड विशेष रूप से केवल पढ़ने या केवल लिखने वाले मामलों के लिए होते हैं।
import java.util.ArrayList;
import java.util.List;
public class Main {
static <T> void swapFirstTwo(List<T> list) {
T tmp = list.get(0);
list.set(0, list.get(1));
list.set(1, tmp);
}
public static void main(String[] args) {
List<String> list = new ArrayList<>(List.of("a", "b"));
swapFirstTwo(list);
System.out.println(list);
}
}त्वरित जाँच
निचली सीमाओं की अपनी समझ जाँचिए।
पुनरावलोकन
आपने निचली सीमा वाले वाइल्डकार्ड सीखे:
? super Tका अर्थ है T का कोई अज्ञात महाप्रकार।- आप T और उसके उपप्रकारों को लिख सकते हैं (उपभोक्ता)।
- पढ़ने पर केवल Object मिलता है।
- यह ठीक उसी तरह
? extends Tका प्रतिबिंब है।
अगला विषय दोनों को जोड़ने वाला नियम है: PECS।
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<? super Integer> list = new ArrayList<Number>();
list.add(42);
System.out.println("Lower bound recap: " + list);
}
}एआई शिक्षक के साथ Java सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 104
- पाठ
- 374
अक्सर पूछे जाने वाले प्रश्न
क्या “निचली सीमा वाले Wildcards” पाठ निःशुल्क है?
हाँ—“निचली सीमा वाले Wildcards” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Java Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“निचली सीमा वाले Wildcards” में मैं क्या सीखूँगा?
उपभोक्ताओं के लिए ? super T आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Java Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Java Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।
“निचली सीमा वाले Wildcards” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Java Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Java Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- ऊपरी सीमा वाले Wildcards
- निचली सीमा वाले Wildcards
- PECS सिद्धांत
- API में Wildcards