PECS सिद्धांत
Producer Extends, Consumer Super
PECS सिद्धांत, CoddyKit पर Java Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Java Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
PECS का अर्थ
PECS का अर्थ उत्पादक Extends, उपभोक्ता Super है। यह Joshua Bloch की Effective Java पुस्तक से लिया गया स्मरण-सूत्र है।
- यदि कोई पैरामीटर T उत्पन्न करता है (आप उससे पढ़ते हैं), तो
? extends Tका उपयोग कीजिए। - यदि कोई पैरामीटर T को ग्रहण करता है (आप उसमें लिखते हैं), तो
? super Tका उपयोग कीजिए।
public class Main {
public static void main(String[] args) {
System.out.println("Producer Extends, Consumer Super");
}
}प्रचलित copy विधि
PECS का पारंपरिक उदाहरण 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<Object> dest = new ArrayList<>();
copy(src, dest);
System.out.println(dest);
}
}दोनों वाइल्डकार्ड लचीलापन क्यों देते हैं
PECS की बदौलत copy कई प्रकार के संयोजनों के साथ काम करता है: Integer स्रोत को Number या Object गंतव्य में, और String स्रोत को CharSequence गंतव्य में कॉपी किया जा सकता है।
वाइल्डकार्ड के बिना प्रकारों का बिल्कुल समान होना आवश्यक होता, जिससे पुनः उपयोग बहुत सीमित हो जाता।
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> ints = List.of(10, 20);
List<Number> nums = new ArrayList<>();
copy(ints, nums);
System.out.println(nums);
}
}उत्पादक का उदाहरण
जो विधि अपने संग्रह से केवल पढ़ती है, उसे extends का उपयोग करना चाहिए। यहाँ हम किसी उत्पादक का योग निकालते हैं।
import java.util.List;
public class Main {
static double sum(List<? extends Number> producer) {
double total = 0;
for (Number n : producer) total += n.doubleValue();
return total;
}
public static void main(String[] args) {
System.out.println(sum(List.of(1, 2, 3)));
System.out.println(sum(List.of(1.1, 2.2)));
}
}उपभोक्ता का उदाहरण
जो विधि अपने संग्रह में केवल लिखती है, उसे super का उपयोग करना चाहिए। यहाँ हम किसी उपभोक्ता में मान डालते हैं।
import java.util.ArrayList;
import java.util.List;
public class Main {
static void pushDigits(List<? super Integer> consumer) {
for (int i = 0; i < 5; i++) consumer.add(i);
}
public static void main(String[] args) {
List<Number> nums = new ArrayList<>();
pushDigits(nums);
System.out.println(nums);
}
}दोनों भूमिकाएँ: सामान्य प्रकार का उपयोग करें
यदि कोई पैरामीटर उत्पादक और उपभोक्ता दोनों है, तो उसमें वाइल्डकार्ड का उपयोग नहीं करना चाहिए।
जो विधि उसी सूची को पढ़ती और लिखती है, उसे सटीक प्रकार T की आवश्यकता होती है।
import java.util.ArrayList;
import java.util.List;
public class Main {
static <T> void rotate(List<T> list) {
if (list.isEmpty()) return;
T last = list.remove(list.size() - 1);
list.add(0, last);
}
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(List.of(1, 2, 3));
rotate(list);
System.out.println(list);
}
}Comparator में PECS
JDK में PECS का व्यापक रूप से उपयोग किया जाता है। Collections.max एक Comparator<? super T> लेता है, क्योंकि तुलना-कर्ता उनकी तुलना करने के लिए T मानों को ग्रहण करता है।
import java.util.Comparator;
import java.util.List;
public class Main {
public static void main(String[] args) {
Comparator<Object> byHash = Comparator.comparingInt(Object::hashCode);
List<String> words = List.of("a", "bb", "ccc");
String max = java.util.Collections.max(words, byHash);
System.out.println(max);
}
}Stream.collect में PECS
कई फ़ंक्शनल इंटरफ़ेस PECS का पालन करते हैं। Consumer<? super T> ऐसे हैंडलर को स्वीकार कर सकता है जो किसी व्यापक प्रकार के लिए लिखा गया हो।
import java.util.List;
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
Consumer<Object> printer = o -> System.out.println("got: " + o);
List<String> items = List.of("x", "y");
items.forEach(printer); // forEach takes Consumer<? super T>
}
}Function के उत्पादक और उपभोक्ता
Function<? super T, ? extends R> PECS का पूर्ण रूप है: इनपुट ग्रहण किया जाता है (super), जबकि आउटपुट उत्पन्न किया जाता है (extends)।
इससे कोई रूपांतरण व्यापक इनपुट स्वीकार करके अधिक संकीर्ण आउटपुट लौटा सकता है।
import java.util.function.Function;
public class Main {
static <T, R> R apply(Function<? super T, ? extends R> fn, T value) {
return fn.apply(value);
}
public static void main(String[] args) {
Function<Object, Integer> len = o -> o.toString().length();
System.out.println(apply(len, "hello"));
}
}लौटाए जाने वाले प्रकार: वाइल्डकार्ड से बचें
लौटाए जाने वाले प्रकारों में वाइल्डकार्ड का उपयोग न करें। इससे कॉल करने वालों को भी वाइल्डकार्ड से निपटना पड़ता है और जटिलता बाहर आ जाती है।
ठोस प्रकार लौटाइए और जहाँ वे लचीलापन देते हैं, वहाँ वाइल्डकार्ड को पैरामीटर तक सीमित रखिए।
import java.util.ArrayList;
import java.util.List;
public class Main {
// Good: concrete return type
static List<Number> doubled(List<? extends Number> src) {
List<Number> out = new ArrayList<>();
for (Number n : src) out.add(n.doubleValue() * 2);
return out;
}
public static void main(String[] args) {
System.out.println(doubled(List.of(1, 2, 3)));
}
}पूर्ण PECS मर्ज
सब कुछ एक साथ देखें: एक merge जो दो उत्पादकों से पढ़कर एक उपभोक्ता में लिखता है।
import java.util.ArrayList;
import java.util.List;
public class Main {
static <T> void merge(List<? extends T> a, List<? extends T> b, List<? super T> out) {
for (T t : a) out.add(t);
for (T t : b) out.add(t);
}
public static void main(String[] args) {
List<Integer> a = List.of(1, 2);
List<Integer> b = List.of(3, 4);
List<Number> out = new ArrayList<>();
merge(a, b, out);
System.out.println(out);
}
}त्वरित जाँच
PECS नियम लागू कीजिए।
पुनरावलोकन
आपने PECS सिद्धांत सीखा:
- उत्पादक Extends: केवल पढ़ने वाले पैरामीटर में
? extends Tका उपयोग करें। - उपभोक्ता Super: केवल लिखने वाले पैरामीटर में
? super Tका उपयोग करें। - दोनों भूमिकाओं वाले पैरामीटर में सामान्य प्रकार पैरामीटर का उपयोग करें।
- लौटाए जाने वाले प्रकारों में वाइल्डकार्ड से बचें।
अगला विषय इन विचारों को वास्तविक एपीआई डिज़ाइन में लागू करना है।
public class Main {
public static void main(String[] args) {
System.out.println("PECS recap: Producer Extends, Consumer Super");
}
}एआई शिक्षक के साथ Java सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 104
- पाठ
- 374
अक्सर पूछे जाने वाले प्रश्न
क्या “PECS सिद्धांत” पाठ निःशुल्क है?
हाँ—“PECS सिद्धांत” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Java Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“PECS सिद्धांत” में मैं क्या सीखूँगा?
Producer Extends, Consumer Super आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Java Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Java Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“PECS सिद्धांत” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Java Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Java Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।