जावा 8 में टाइप इंट्रेंस


30

जावा 8 में नए लैम्ब्डा नोटेशन (उदाहरण के लिए इस लेख को देखें ) की शुरूआत किसी प्रकार के अनुमान की आवश्यकता है?

यदि हां, तो नई प्रकार की प्रणाली जावा भाषा को समग्र रूप से कैसे प्रभावित करेगी?

जवाबों:


47

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

सबसे पहले, मूल प्रश्न के संक्षिप्त उत्तर हां और नहीं हैं। हां, जावा 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 टॉक लैम्बडा: ए पीक अंडर द हूड' देखें


2
"वे इसे अलग तरीके से पकड़ते हैं। एक आंतरिक वर्ग में, यह आंतरिक वर्ग का उदाहरण है, जबकि एक लंबोदर में, यह संलग्न उदाहरण है। निम्नलिखित पर विचार करें:" अभी भी सभी के thisसाथ प्रतिस्थापित करके वाक्यगत शर्करा के साथ किया जा सकता हैMyClass.this
शाफ़्ट क्रेक

4
सब कुछ जो असेंबलर (और कभी-कभी भी) से परे चला जाता है, यकीनन सिंटैक्टिक शुगर है। लेकिन लैम्ब्डा आंतरिक कक्षाओं (किसी भी अधिक) के लिए सिंटैक्टिक चीनी नहीं हैं । वे एक समान लक्ष्य की सेवा करते हैं और कुछ समानताएं हैं, लेकिन हुड के तहत वे (ऑब्जर्वेटली) अलग हैं।
जोआचिम सॉरे

1
"लैम्ब्डा अभिव्यक्ति आंतरिक रूप से अलग-अलग हैं, और वे आंतरिक कक्षाओं से अलग तरीके से कार्यान्वित की जाती हैं।": बहुत अच्छी व्याख्या (+1) के लिए धन्यवाद। मेरे लिए अभी भी स्पष्ट नहीं है कि लैंबडास को विशेष गुमनाम वर्गों के लिए सिंटैक्टिक चीनी के रूप में क्यों लागू नहीं किया गया है या, दूसरे शब्दों में, नए शब्दार्थ द्वारा शुरू की गई अतिरिक्त जटिलता का क्या फायदा है? अनाम आंतरिक वर्गों के साथ हल नहीं की जा सकने वाली यह समस्या क्या हल करती है? (लेकिन मुझे अभी भी आपके द्वारा पोस्ट किए गए लिंक को देखना है, शायद मुझे वहां जवाब मिल जाएगा।)
जियोर्जियो

1
@ जोकिम सौर: मैं सिंटैक्टिक शुगर को एक मौजूदा शब्दार्थ के लिए एक नया वाक्यविन्यास मानूंगा। जब नया शब्दार्थ पेश किया जाता है, तो मुझे लगता है कि आप सिंटैक्टिक शुगर के बारे में नहीं बोल सकते। इस अर्थ में, मुझे नहीं लगता है कि आप तर्क दे सकते हैं कि कोडांतरक से परे सब कुछ वाक्यगत चीनी है।
जियोर्जियो

3
@ जियोर्जियो: अनाम आंतरिक वर्गों के लिए लैम्ब्डा सिंटैक्टिक शुगर क्यों नहीं है, इस बारे में पता चला है कि इस बारे में एक बड़ी चर्चा हुई थी। ब्रायन गोएट्ज का यह मेल निर्णय को सारांशित करता है: mail.openjdk.java.net/pipermail/lambda-dev/2011-August/… । टीएल; डीआर यह भविष्य के विकास के लिए दरवाजा खुला छोड़ देता है और हमें आज बेहतर प्रदर्शन मिलता है। Goetz वास्तव में एक संबंधित प्रश्न का उत्तर दे रहा है, क्या लंबोदर वस्तुएं हैं? लेकिन अगर जवाब नहीं है या शायद यह भी है कि इसका मतलब है कि वे आंतरिक वर्गों के लिए चीनी नहीं हो सकते।
स्टुअर्ट मार्क्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.