उदाहरण वहाँ से पता चला (JLS से उद्धृत) यह की तरह ध्वनि बनाता है पुल विधियों का उपयोग केवल उन परिस्थितियों में किया जाता है जहां कच्चे प्रकार का उपयोग किया जाता है।चूंकि यह मामला नहीं है, मैंने सोचा कि मैं एक उदाहरण के साथ पाइप करूंगा जहां पुल विधियों का उपयोग पूरी तरह से टाइप-सही जेनेरिक कोड के लिए किया जाता है।
public static interface Function<A,R> {
public R apply (A arg);
}
public static <A, R> R applyFunc (Function<A,R> func, A arg) {
return func.apply(arg);
}
आप निम्नलिखित तरीके से इस कोड का उपयोग करते हैं, तो एक पुल विधि का इस्तेमाल किया जाता है::
निम्नलिखित इंटरफेस और समारोह पर विचार करें
Function<String, String> lower = new Function<String, String>() {
public String apply (String arg) {
return arg.toLowerCase();
}
};
applyFunc(lower, "Hello");
विलोपन के बाद, Function
इंटरफ़ेस विधि शामिल apply(Object)Object
(जिसे आप बाइटकोड को डीकंपलिंग करके पुष्टि कर सकते हैं)। स्वाभाविक रूप से, यदि आप applyFunc
के लिए डिकंपिल्ड कोड देखते हैं तो आप देखेंगे कि इसमें apply(Object)Object
पर कॉल है। Object
अपने प्रकार चर के ऊपरी बाउंड है, इसलिए कोई अन्य हस्ताक्षर समझ में नहीं आता है।
तो जबविधि के साथ एक अज्ञात वर्ग बनाया गया है, तो यह वास्तव में Function
इंटरफ़ेस को लागू नहीं करता है जब तक कोई पुल विधि नहीं बनाई जाती। पुल विधि सभी सामान्य रूप से टाइप किए गए कोड को Function
कार्यान्वयन का उपयोग करने की अनुमति देती है।
दिलचस्प है, केवल तभी वर्ग हस्ताक्षर apply(String)String
और के साथ कुछ अन्य इंटरफ़ेस कार्यान्वित ही अगर विधि है कि इंटरफ़ेस प्रकार की एक संदर्भ के माध्यम से बुलाया गया था संकलक कभी कि हस्ताक्षर के साथ एक फोन का उत्सर्जन होता है।
यहां तक कि अगर मैं निम्नलिखित कोड है:
Function<String, String> lower = ...;
lower.apply("Hello");
संकलक अभी भी apply(Object)Object
के लिए एक कॉल उत्सर्जन करता है।
वास्तव संकलक apply(String)String
कॉल करने के लिए प्राप्त करने के लिए एक अन्य तरीका है, लेकिन यह एक गुमनाम वर्ग निर्माण अभिव्यक्ति करने के लिए सौंपा जादुई प्रकार है जो अन्यथा नीचे लिखा नहीं किया जा सकता का लाभ लेता है:
new Function<String, String>() {
public String apply (String arg) {
return arg.toLowerCase();
}
}.apply("Hello");
जेनरिक के बिना भी, कॉन्वेंट रिटर्न प्रकारों के लिए ब्रिज विधियां आवश्यक हैं। –
BridgeMethodResolver लिंक टूटा हुआ है :( – BrunoJCM
@ ब्रूनोजेसीएम अच्छा पकड़। मैंने लिंक को पुनर्स्थापित कर दिया है (कक्षा को परियोजना 'org.springframework.core' से' स्प्रिंग-फ्रेमवर्क 'प्रोजेक्ट में स्थानांतरित कर दिया गया है: https://fisheye.springsource.org /browse/spring-framework/org.springframework.core/src/main/java/org/springframework/core/BridgeMethodResolver.java#rdc41daa3db350ef9a4b14ef1d750d79cb22cf431) – VonC