जावा 8 में नए लैम्ब्डा नोटेशन (उदाहरण के लिए इस लेख को देखें ) की शुरूआत किसी प्रकार के अनुमान की आवश्यकता है?
यदि हां, तो नई प्रकार की प्रणाली जावा भाषा को समग्र रूप से कैसे प्रभावित करेगी?
जावा 8 में नए लैम्ब्डा नोटेशन (उदाहरण के लिए इस लेख को देखें ) की शुरूआत किसी प्रकार के अनुमान की आवश्यकता है?
यदि हां, तो नई प्रकार की प्रणाली जावा भाषा को समग्र रूप से कैसे प्रभावित करेगी?
जवाबों:
शाफ़्ट के फ्रीक के उत्तर और उसके कमेंट थ्रेड में गलत जानकारी है । मैं यहाँ एक जवाब में जवाब दूंगा, क्योंकि एक टिप्पणी बहुत छोटी है। इसके अलावा, चूंकि यह एक उत्तर है, इसलिए मैं मूल प्रश्न का उत्तर देने का प्रयास करूंगा। (ध्यान दें कि मैं टाइप सिस्टम का विशेषज्ञ नहीं हूं।)
सबसे पहले, मूल प्रश्न के संक्षिप्त उत्तर हां और नहीं हैं। हां, जावा 8 में जावा 7 की तुलना में काफी अधिक प्रकार के अनुमान होंगे, और नहीं, जावा 8 में "नया" प्रकार का सिस्टम नहीं है, हालांकि कुछ मामूली बदलाव हैं ।
जावा 8 अभी भी वैधानिक रूप से टाइप किया जाएगा, और इसमें अभी भी कक्षाओं और इंटरफेस के बीच द्विभाजन होगा। कोई नया प्रकार नहीं हैं जैसे फ़ंक्शन प्रकार। एक लंबोदर का प्रकार अनिवार्य रूप से एक "कार्यात्मक इंटरफ़ेस" है जो एक एकल सार पद्धति के साथ एक साधारण इंटरफ़ेस है।
इंटरफेसेस में अब डिफ़ॉल्ट विधियों के रूप में कोड हो सकते हैं, लेकिन कक्षाओं के एकल-भाग का मॉडल और इंटरफ़ेस का एकाधिक वंशानुक्रम समान रहता है। कुछ समायोजन हैं, निश्चित रूप से, जैसे कि डिफ़ॉल्ट तरीकों की उपस्थिति में विधि संकल्प के लिए नियम, लेकिन मूल तत्व अपरिवर्तित हैं।
किसी भी प्रकार कि अनुमान से अनुमान लगाकर स्पष्ट रूप से लिखा जा सकता है। शाफ़्ट सनकी उदाहरण का उपयोग करने के लिए,
Collections.<MyClass>sort(list, (a, b) -> { return a.order - b.order; });
मूल रूप से चीनी है
Collections.<MyClass>sort(list,
(Comparator<MyClass>)((MyClass a, MyClass b) -> { return a.order - b.order; }));
तो स्पार्कलेसी का कथन "प्रकार के अनुमान के लिए किसी प्रकार के विस्तार की आवश्यकता नहीं है" मूल रूप से सही है।
लेकिन सिंटैक्टिक शुगर पर लौटने के लिए, मैं अपने बयान को दोहराऊंगा कि एक लंबोदर अभिव्यक्ति एक अनाम आंतरिक वर्ग के लिए सिंटैक्टिक चीनी नहीं है। Ratchet सनकी कहा गया है कि एक लैम्ब्डा अभिव्यक्ति एक गुमनाम आंतरिक वर्ग इन्स्टेन्शियशन में अनुवाद किया गया है, और Sparkleshy बस reasserted कि एक लैम्ब्डा है एक गुमनाम आंतरिक वर्ग के लिए वाक्यात्मक चीनी, लेकिन इन बयानों सही नहीं हैं। वे शायद पुरानी जानकारी पर आधारित हैं। प्रारंभिक लैंबडा कार्यान्वयन ने लैम्ब्डा को इस तरह लागू किया, लेकिन चीजें बदल गई हैं।
लैम्ब्डा अभिव्यक्ति आंतरिक रूप से अलग-अलग वर्गों से होती है, और उन्हें आंतरिक कक्षाओं से अलग तरीके से लागू किया जाता है।
लंबोदर भाव एक-दूसरे से आंतरिक वर्गों से शब्दार्थ में भिन्न हैं। एक लंबोदर अभिव्यक्ति का मूल्यांकन करने के लिए हर बार एक नया उदाहरण बनाने की आवश्यकता नहीं है। उनके पास अलग-अलग कैप्चर शब्दार्थ भी हैं, उदाहरण के लिए, वे इसे अलग तरीके से कैप्चर करते हैं । एक आंतरिक वर्ग में, यह आंतरिक वर्ग का उदाहरण है, जबकि एक लैम्ब्डा में, यह संलग्न उदाहरण है। निम्नलिखित को धयान मे रखते हुए:
public class CaptureThis {
void a(Runnable r) { r.run(); }
void b() {
a(new Runnable() { public void run() { System.out.println(this); }});
a(() -> System.out.println(this));
}
public String toString() { return "outer"; }
public static void main(String[] args) { new CaptureThis().b(); }
}
हाल ही में JDK 8 लैंबडा बिल्ड (मैंने b69 का उपयोग किया ) में, आउटपुट कुछ इस तरह होगा:
CaptureThis$1@113de03
outer
इसके अलावा, लैम्ब्डा अभिव्यक्तियों को आंतरिक कक्षाओं से पूरी तरह से अलग तरीके से लागू किया जाता है। यदि आप असंतुष्ट आउटपुट की तुलना करते हैं, तो आप देखेंगे कि आंतरिक वर्ग कोड सीधे निर्माण के लिए संकलित करता है और कैप्चर $ 1 के एक निर्माता को कॉल करता है, जबकि लैम्ब्डा एक्सप्रेशन एक चालान किए गए निर्देश को संकलित करता है जो एक अनिर्दिष्ट साधन के माध्यम से एक रननेबल की खरीद करता है। यह कैसे और क्यों काम करता है, इसकी पूरी व्याख्या के लिए, ब्रायन गोएटज़ के 'जावाऑन 2012 टॉक लैम्बडा: ए पीक अंडर द हूड' देखें ।
this
साथ प्रतिस्थापित करके वाक्यगत शर्करा के साथ किया जा सकता हैMyClass.this