मैं इसे सरल तरीके से समझाता हूँ।
क्लास स्तर पर परिभाषित जेनरिक (स्टैटिक) विधि स्तर पर परिभाषित जेनरिक से पूरी तरह अलग हैं।
class Greet<T> {
public static <T> void sayHello(T obj) {
System.out.println("Hello " + obj);
}
}
जब आप उपरोक्त कोड कहीं भी देखते हैं, तो कृपया ध्यान दें कि क्लास स्तर पर परिभाषित टी का स्थैतिक विधि में परिभाषित टी के साथ कोई लेना-देना नहीं है। निम्न कोड भी पूरी तरह से मान्य है और उपरोक्त कोड के बराबर है।
class Greet<T> {
public static <E> void sayHello(E obj) {
System.out.println("Hello " + obj);
}
}
स्टैटिक विधि को क्लास के लोगों से अलग अपने जेनेरिक को अलग करने की आवश्यकता क्यों है?
ऐसा इसलिए है, क्योंकि स्टैटिक मेथड को क्लास को बिना इंस्टेंट किए भी बुलाया जा सकता है। इसलिए यदि कक्षा अभी तक त्वरित नहीं है, तो हमें अभी तक नहीं पता है कि टी क्या है। यही कारण है कि स्थैतिक तरीकों की अपनी उत्पत्ति की आवश्यकता है।
इसलिए, जब भी आप स्थैतिक विधि को बुला रहे हैं,
Greet.sayHello("Bob");
Greet.sayHello(123);
जेवीएम निम्नलिखित के रूप में व्याख्या करता है।
Greet.<String>sayHello("Bob");
Greet.<Integer>sayHello(123);
दोनों एक ही आउटपुट दे रहे हैं।
Hello Bob
Hello 123