आप एक विधि पर एक प्रकार पैरामीटर घोषित हैं, तो आप फोन करने वाले है, जब तक कि वास्तविक प्रकार की कमी को पूरा करेंगे इसके लिए एक वास्तविक प्रकार चुनने को अनुमति दे रहे हैं। उस प्रकार को एक वास्तविक ठोस प्रकार नहीं होना चाहिए, यह एक अमूर्त प्रकार, एक प्रकार चर या एक चौराहे प्रकार हो सकता है, अन्य में, अधिक बोलचाल शब्द, एक काल्पनिक प्रकार। तो, as said by Mureinik, String
का विस्तार करने और List
लागू करने वाला एक प्रकार हो सकता है। हम स्वयं मंगलाचरण के लिए एक चौराहे के प्रकार का उल्लेख नहीं कर सकते, लेकिन हम तर्क प्रदर्शित करने के लिए एक प्रकार चर का उपयोग कर सकते हैं:
public class Main {
public static <X extends String&List<Integer>> void main(String[] args) {
String s = Main.<X>newList();
System.out.println(s);
}
private static <T extends List<Integer>> T newList() {
return (T) new ArrayList<Integer>();
}
}
बेशक
, newList()
इस तरह के एक प्रकार के लौटने की उम्मीद को पूरा नहीं कर सकते हैं, लेकिन यह है इस विधि की परिभाषा (या कार्यान्वयन) की समस्या। ArrayList
से T
पर कास्टिंग करते समय आपको "अनचेक" चेतावनी मिलनी चाहिए। एकमात्र संभव सही कार्यान्वयन यहां null
लौटाएगा, जो विधि को बेकार प्रदान करता है।
प्रारंभिक कथन दोहराने के लिए बिंदु यह है कि एक सामान्य विधि के कॉलर प्रकार पैरामीटर के लिए वास्तविक प्रकार चुनता है। इसके विपरीत, जब आप एक सामान्य वर्ग तरह प्रकार पैरामीटर
public class SomeClass<T extends List<Integer>> {
public void main(String[] args) {
String s = newList(); // this doesn't compile anymore
System.out.println(s);
}
private T newList() {
return (T) new ArrayList<Integer>();
}
}
साथ वर्ग के अनुबंध का हिस्सा है की घोषणा है, तो जो कोई भी बनाता है एक उदाहरण है कि उदाहरण के लिए वास्तविक प्रकार का चुनाव करेगा। उदाहरण विधि main
उस वर्ग का हिस्सा है और उसे उस अनुबंध का पालन करना होगा।आप T
नहीं चुन सकते हैं; T
के लिए वास्तविक प्रकार सेट किया गया है और जावा में, आप आमतौर पर यह भी नहीं पता कि T
क्या है।
जेनेरिक प्रोग्रामिंग का मुख्य बिंदु कोड लिखना है जो स्वतंत्र रूप से काम करता है कि किस प्रकार के प्रकार पैरामीटर के लिए चुना गया है।
लेकिन ध्यान दें कि आप अन्य बना सकते हैं, जो भी प्रकार आप पसंद करते हैं और विधि का आह्वान करते हैं, उदाहरण के साथ स्वतंत्र उदाहरण।
public class SomeClass<T extends List<Integer>> {
public <X extends String&List<Integer>> void main(String[] args) {
String s = new SomeClass<X>().newList();
System.out.println(s);
}
private T newList() {
return (T) new ArrayList<Integer>();
}
}
यहां, नए उदाहरण के निर्माता उस उदाहरण के लिए वास्तविक प्रकार चुनते हैं। जैसा कि कहा गया है, वास्तविक प्रकार को ठोस प्रकार की आवश्यकता नहीं है।
संबंधित http://stackoverflow.com/questions/36402646/generic-return-type-upper-bound-interface-vs-class-surprisingly- valid-code – Tunaki
अद्यतन करने का कारण यह है कि पहला यदि कोई बाधा संतोषजनक संतुष्ट हो तो संस्करण काम कर सकता है (टी सूची और टी स्ट्रिंग को बढ़ाता है) [यानी यह एक अस्तित्वत्मक मात्रा है], जबकि दूसरा संस्करण केवल तभी काम कर सकता है जब कक्षा में घोषणा से मेल खाने वाले सभी संभावित प्रकार टी स्ट्रिंग का विस्तार भी करते हैं [यानी। यह एक सार्वभौमिक मात्रा है]। –