दिलचस्प पोस्ट
Node.js + Nginx – अब क्या? IPhone में पॉपअप के रूप में प्रदर्शन UIViewController एक शब्दकोश में चर संरचना को संशोधित करें डी 3 – कैसे JSON डेटा संरचनाओं से निपटने के लिए? कितनी अच्छी तरह बाइनरी फ़ाइलों को संग्रहीत करने में सबवर्सन है? क्यों eval के लिए खुला उद्धरण और ब्रैकेट ('(' + jsonString + ')' ') जब json स्ट्रिंग पार्स करते हैं मैं कैसे जांच करूं कि क्या यूट्यूब पर एक वीडियो मौजूद है, PHP का उपयोग कर? आप ग्लोबल / वेबग्ल के 4, 8 बिट इनट में एक 32 बिट इंट कैसे पैक करते हैं? फिट करने के लिए एक UILabel आकार Printf के लिए एच और एचएच संशोधक का क्या उद्देश्य है? क्यों फ़ायरफ़ॉक्स <audio> में एमपी 3 फ़ाइल स्वरूप का समर्थन नहीं करता है जावा में लाइनों के साथ ड्रा करें जावा में 'सार्वजनिक स्थिर शून्य' का क्या अर्थ है? स्केल फ़ंक्शन 22 पैरामीटर तक सीमित क्यों हैं? जबकि ब्लूबर्ड वादों का इस्तेमाल करते हुए लूप

जावा जेनेरिक्स – पुल विधि?

जावा जेनेरिक्स से संबंधित "पुल विधि" अवधारणा को कुछ कहा जाता है, मुझे एक बिंदु पर रोक दिया गया और इसके बारे में सोच रहा था।

बीटीडब्ल्यू, मैं केवल यह जानता हूं कि यह बाइटकोड स्तर पर होता है और हमारे लिए उपयोग करने के लिए उपलब्ध नहीं है।

लेकिन जावा संकलक द्वारा उपयोग किए गए "पुल विधि" के पीछे की अवधारणा को जानने के लिए मैं उत्सुक हूं।

पर्दे के पीछे क्या वास्तव में होता है और इसका उपयोग क्यों किया जाता है?

एक उदाहरण के साथ कोई मदद काफी सराहना की जाएगी

वेब के समाधान से एकत्रित समाधान "जावा जेनेरिक्स – पुल विधि?"

यह एक ऐसा तरीका है जो क्लास को एक सामान्य श्रेणी का विस्तार करने या एक सामान्य इंटरफ़ेस (एक ठोस प्रकार पैरामीटर के साथ) को लागू करने की अनुमति देता है, फिर भी इसे एक कच्चा प्रकार के रूप में इस्तेमाल किया जा सकता है।

इसकी कल्पना करें:

public class MyComparator implements Comparator<Integer> { public int compare(Integer a, Integer b) { // } } 

यह अपने कच्चे रूप में इस्तेमाल नहीं किया जा सकता है, जो तुलना करने के लिए दो Object पारित करते हैं, क्योंकि प्रकार की तुलना पद्धति में संकलित होती है (यह क्या होता है इसके विपरीत यह एक सामान्य प्रकार पैरामीटर टी, जहां प्रकार मिट जाएगा)। इसके बजाए, परिदृश्य के पीछे, कंपाइलर एक "पुल विधि" जोड़ता है, जो ऐसा कुछ दिखता है (यह जावा स्रोत था):

 public class MyComparator implements Comparator<Integer> { public int compare(Integer a, Integer b) { // } //THIS is a "bridge method" public int compare(Object a, Object b) { return compare((Integer)a, (Integer)b); } } 

कंपाइलर पुल विधि तक पहुंच की रक्षा करता है, जो स्पष्ट कॉल को सीधे लागू करता है, जिसके परिणामस्वरूप एक संकलन समय त्रुटि होती है। अब क्लास अपने कच्चे रूप में भी इस्तेमाल किया जा सकता है:

 Object a = 5; Object b = 6; Comparator rawComp = new MyComparator(); int comp = rawComp.compare(a, b); 

यह क्यों आवश्यक है?

कच्चे प्रकारों के स्पष्ट उपयोग के लिए समर्थन जोड़ने के अलावा (जो मुख्यत: पीछे की संगतता के लिए है) पुल के तरीकों को भी प्रकार के विलोपन को समर्थन देने के लिए आवश्यक है। प्रकार के विस्मरण के साथ, इस तरह एक विधि:

 public <T> T max(List<T> list, Comparator<T> comp) { T biggestSoFar = list.get(0); for ( T t : list ) { if (comp.compare(t, biggestSoFar) > 0) { biggestSoFar = t; } } return biggestSoFar; } 

वास्तव में इस के साथ संगत है बाइटकोक में संकलित:

 public Object max(List list, Comparator comp) { Object biggestSoFar = list.get(0); for ( Object t : list ) { if (comp.compare(t, biggestSoFar) > 0) { //IMPORTANT biggestSoFar = t; } } return biggestSoFar; } 

यदि पुल विधि मौजूद नहीं है और आपने इस फ़ंक्शन के लिए एक List<Integer> और एक MyComparator पास किया है, तो टैग किए गए टैग पर कॉल विफल होगा क्योंकि MyComparator पास कोई विधि नहीं होती है जो कि दो Object लेती है … केवल एक कि दो Integer एस लेता है

नीचे दिए गए प्रश्न एक अच्छी पढें हैं।

यह भी देखें:

  • जेनरिक्स एफएक्यू – एक पुल विधि क्या है?
  • जावा पुल विधियों समझाया (धन्यवाद @ बुजो )

यह ध्यान देने योग्य है कि कंपाइलर ने MyComparator की विधि का अनुमान MyComparator :

 public int compare(Integer a, Integer b) {/* code */} 

ओवरराइड करने की कोशिश कर रहा है Comparator<T> 's

 public int compare(T a, T b); 

घोषित प्रकार Comparator<Integer> अन्यथा, MyComparator की compare कंपाइलर द्वारा एक अतिरिक्त (ओवरलोडिंग) के रूप में की जाएगी, और ओवरराइड करने वाला नहीं, विधि। और इस तरह, इसके लिए कोई पुल पद्धति नहीं बनाई जाएगी।