एक जेनेरिक टाइप ऐसा जेनेरिक क्लास या इंटरफ़ेस होता है जिसमें टाइपों को पैरामीटर के रूप में दिया जाता है। इससे कंपाइलर उस क्लास या इंटरफ़ेस पर टाइप सेफ्टी लागू कर पाता है।
इस गैर-जेनेरिक Container इंटरफ़ेस को देखिए:
class Container {
private Object object;
public void set(Object object) { this.object = object; }
public Object get() { return object; }
}
चूँकि यह ऑब्जेक्ट टाइप लेता है और लौटाता है, यह किसी भी नॉन-प्रिमिटिव टाइप के साथ काम करता है। लेकिन इसकी एक कीमत चुकानी पड़ती है, क्योंकि हो सकता है कुछ कोड get को कॉल करते समय Integer की उम्मीद करे, जबकि कोई और कोड set को कॉल करके String जोड़ रहा हो। नतीजा यह होता है कि रनटाइम एक्सेप्शन मिलती है।
एक जेनेरिक क्लास और जेनेरिक इंटरफ़ेस का रूप इस तरह होता है:
class ClassName<T1, T2, ..., Tn> { ... }
interface InterfaceName<T1, T2, ..., Tn> { ... }
क्लास या इंटरफ़ेस के नाम के बाद एंगल ब्रैकेट (<>) में लिखा गया टाइप पैरामीटर वाला हिस्सा उन टाइप पैरामीटरों को बताता है, जिन्हें टाइप वेरिएबल भी कहा जाता है: T1, T2, ..., और Tn. इनका उपयोग क्लास या इंटरफ़ेस के भीतर किया जा सकता है, जिससे जेनेरिक टाइप सेफ्टी मिलती है।
यह Container का जेनेरिक रूप है:
class Container<E> {
private E object;
public void set(E object) { this.object = object; }
public E get() { return object; }
}
अब इसे बनाते समय हमें घोषित करना पड़ता है कि यह किस टाइप की वैल्यू रखेगा, और कंपाइलर उस शर्त को लागू करता है:
// empty <> can infer from context
Container<String> stringContainer = new Container<>();
// compiler knows this is a String, so it is allowed
stringContainer.set("Some string");
// no cast needed, compiler knows it is a String
String result = stringContainer.get();
// this causes a compiler error:
stringContainer.set(42);
List जावा का क्रमबद्ध संग्रह है। ऐरे के विपरीत, एक List अपना आकार बढ़ा सकता है, ताकि वह कितने भी एलिमेंट रख सके। एक मानक इम्प्लीमेंटेशन ArrayList है, जिसके पीछे एक ऐसा ऐरे होता है जिसका आकार बदला जा सकता है। दूसरा मानक इम्प्लीमेंटेशन LinkedList क्लास है, जिसके पीछे एक डबली-लिंक्ड लिस्ट होती है।
List खाली हो सकता है, या उसमें कितने भी एलिमेंट हो सकते हैं (डुप्लिकेट सहित)। List एक जेनेरिक इंटरफ़ेस है, और उसका टाइप बताता है कि वह किस टाइप के ऑब्जेक्ट रख सकता है। उदाहरण के लिए:
List<String> emptyListOfStrings = List.of();
List<Integer> singleInteger = List.of(1);
List<Boolean> threeBooleans = List.of(true, false, true);
List<Object> listWithMultipleTypes = List.of("hello", 1, true);
List में एलिमेंट जोड़ने, हटाने, निकालने और यह जाँचने के लिए कई उपयोगी मेथड होते हैं कि कोई एलिमेंट मौजूद है या नहीं:
List<Character> vowels = new ArrayList<>(List.of('a', 'e', 'i', 'o', 'i', 'e', 'a'));
int startingSize = vowels.size(); // 7
vowels.add('u'); // vowels is now ['a', 'e', 'i', 'o', 'i', 'e', 'a', 'u']
char a = vowels.get(0); // 'a'
boolean hadI = vowels.remove('i'); // true and vowels is now ['a', 'e', 'o', 'i', 'e', 'a', 'u']
boolean hasI = vowels.contains('i'); // true (still have one more left)
कार्ल Exercism की वेबसाइट पर सीखने के लिए भाषाओं का ऐरे बनाए रखना चाहता है। कार्ल को नई भाषाएँ जोड़ने, पुरानी भाषाएँ हटाने और यह जाँचने की ज़रूरत है कि कौन-सी भाषाएँ ऐरे में हैं। अगर कार्ल Java या Kotlin सीखना चाहता है, तो यह बहुत रोमांचक होगा!
कार्ल को जानना है कि उसका भाषाओं का ऐरे कभी खाली हो जाता है या नहीं, ताकि वह सीखने के लिए और भाषाएँ ढूँढ सके! isEmpty नाम का मेथड बनाइए, जो ऐरे में कोई भाषा न होने पर true लौटाता है।
if (languageList.isEmpty()) {
findMoreLanguagesToLearn();
}
कार्ल Kotlin और Python सीखने को उत्सुक है! addLanguage नाम का मेथड बनाकर कार्ल को शुरुआत करने में मदद कीजिए। यह मेथड वह भाषा लेता है जिसे कार्ल सीखना चाहता है और उसे ऐरे में जोड़ देता है।
languageList.addLanguage("Kotlin");
languageList.addLanguage("Python");
कार्ल ने तय किया कि वह अभी Scala नहीं सीखना चाहता। removeLanguage नाम का मेथड बनाकर कार्ल को यह भाषा ऐरे से हटाने में मदद कीजिए। यह मेथड वह भाषा लेता है जिसे हटाना है और उसे ऐरे से हटा देता है।
languageList.removeLanguage("Scala");
कार्ल उस पहली भाषा को याद रखना चाहता है जो उसने ऐरे में सबसे पहले जोड़ी थी (और जो अब भी ऐरे में है)। firstLanguage नाम का मेथड बनाइए, जो ऐरे की पहली भाषा लौटाता है।
String kotlin = languageList.firstLanguage(); // "Kotlin"
कार्ल को जानना है कि वह कितनी भाषाएँ सीखने की कोशिश कर रहा है। count नाम का मेथड बनाकर कार्ल को इसका जवाब ढूँढने में मदद कीजिए। यह मेथड ऐरे में मौजूद भाषाओं की संख्या लौटाता है।
int two = languageList.count(); // 2
कार्ल यह याद करने की कोशिश कर रहा है कि वह Python सीखना चाहता था या Ruby। containsLanguage नाम का मेथड बनाइए, जो वह भाषा लेता है जिसके बारे में कार्ल पूछ रहा है, ताकि कार्ल को पता चल सके!
boolean learningPython = languageList.containsLanguage("Python"); // true
boolean learningRuby = languageList.containsLanguage("Ruby"); // false
अगर कार्ल Java या Kotlin सीखना चाहता है, तो यह बहुत रोमांचक है! isExciting नाम का मेथड बनाइए, जो true लौटाता है अगर कार्ल Java या Kotlin सीखना चाहता है।
javaLanguageList.isExciting() // true
neitherKotlinNorJavaLanguageList.isExciting() // false
Exercism पर साइन अप कीजिए और Java को 26 कॉन्सेप्ट158 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।