public class Program {
private static <Program> void foo(Program x){
System.out.println(x+"-->1");
}
private static void foo(final int i){
System.out.println(i+"-->2");
}
public static void main(String[] args) {
Integer i = 10;
foo(i);
}
}
और उत्पादन होता है:जावा में जेनेरिक निम्नलिखित प्रोग्राम के लिए कैसे काम करता है?
10-->1
मैं इस विषय पर किसी भी प्रासंगिक चर्चा को खोजने के लिए सक्षम नहीं था। हालांकि, एक अलग विषय का जवाब मुझे एक छोटे से उलझन में: - Return Type of Java Generic Methods
उनके मुताबिक सामान्य <Program>
अगर मैं इस कार्यक्रम के रूप में नीचे तो उत्पादन के लिए एक छोटे से बदल वापसी प्रकार के साथ लेकिन मेरे मामले में कोई संबंध नहीं है फरक है।
public class Program {
private static <Integer> void foo(Program x){
System.out.println(x+"-->1");
}
private static void foo(final int i){
System.out.println(i+"-->2");
}
public static void main(String[] args) {
Integer i = 10;
foo(i);
}
}
आउटपुट:
10-->2
मैं JDK1.7
आपके दूसरे उदाहरण में, केवल 'foo()' का दूसरा संस्करण एक हस्ताक्षर है जो आप 'मुख्य()' में जो कॉल कर रहे हैं उससे मेल खा सकता है। पहले उदाहरण में, एक प्राथमिकता नियम होना चाहिए जो अनबॉक्सिंग से पहले जेनेरिक फ़ंक्शन में 'इंटेगर' कॉल से मेल खाता है और विकल्प को कॉल करने पर विचार किया जाता है। –
आप इस लाइन पर एक नया सामान्य प्रकार पैरामीटर 'प्रोग्राम' परिभाषित कर रहे हैं: 'निजी स्थिर शून्य foo (प्रोग्राम x) {'। उस प्रकार पैरामीटर के पास 'प्रोग्राम' नामक आपकी कक्षा के साथ कुछ लेना देना नहीं है।जब आप टाइप पैरामीटर का नाम 'इंटीजर' में बदलते हैं, तो पैरामीटर 'प्रोग्राम एक्स' अचानक आपके वास्तविक वर्ग 'प्रोग्राम' का एक प्रकार होता है। सबक: मौजूद वास्तविक वर्गों के लिए अपने प्रकार के पैरामीटर का नाम न दें। –
marstran
यदि आपका जेनेरिक पैरामीटर नाम एकल अपरकेस अक्षर के साथ वर्तनी के सम्मेलन का पालन करता है तो आपका कोड बहुत आसान होगा। भले ही, यह निराशाजनक रूप से भ्रमित हो रहा है जब आप उन्हें ठोस प्रकार के समान नाम देते हैं, जो कि कम से कम एक है। अपने जेनेरिक पैरामीटर नामों को अपने प्रकार के नाम से अलग करें! –