2010-06-15 12 views
23

कुछ ओपनजेडीके मेलिंगलिस्ट प्रविष्टियों को पढ़ने के बाद, ऐसा लगता है कि ओरेकल डेवलपर्स वर्तमान में बंद होने के प्रस्ताव से चीजों को हटा रहे हैं, क्योंकि जावा भाषा में पहले की डिज़ाइन गलतियों जावा बंद होने की जटिलता को जटिल करती हैं।स्कैला क्लोजर और जावा 8 बंद करने के बीच संगतता

यह ध्यान में रखते हुए कि जावा 8 के लिए योजनाबद्ध बंद होने की तुलना में स्कैला बंद करना अधिक शक्तिशाली है, मुझे आश्चर्य है कि यह ई के लिए संभव होगा। जी। जावा पद्धति को स्कैला से बंद करने, जावा में बंद करने और इसे स्कैला फ़ंक्शन इत्यादि देने के लिए कॉल करें?

तो क्या जावा बंद को बाइटकोड या अलग-अलग में अपने स्कैला समकक्षों की तरह प्रदर्शित किया जाएगा? जावा/स्कैला बंद करने के बीच कार्यक्षमता के अंतर को बंद करना संभव होगा?

+3

मुझे संदेह है कि हम जावा 7 रिलीज – CheesePls

+1

के करीब तक एक निश्चित सवाल नहीं जानते हैं। आप निश्चित रूप से स्कैला (और अन्य भाषाओं) से जावा क्लोजर का उपयोग करने में सक्षम होंगे जो रनटाइम ऑपरेटिबिलिटी के लिए अच्छी बात है। लेकिन जावा क्लोजर निर्दिष्ट नहीं हैं इसलिए विवरण अभी तक नहीं हैं। –

+1

@ थॉमस आपको इतना निश्चित बनाता है कि जावा बंद स्केल से उपयोग करने योग्य हैं, इस पर विचार करते हुए कि स्काला बंद करने के लिए कक्षाएं लागू की जाएंगी, इसका मतलब यह नहीं होगा कि जावा को स्केल के FunnctionX को तर्क प्रकार के रूप में उपयोग करना होगा? – soc

उत्तर

2

नोट:

स्काला 2.12 जावा 8 रूप में एक ही शैली में बंद का उत्सर्जन करता है: 5 साल बाद, SCALA 2.12.0-M3 (Oct. 2015) इस वृद्धि में शामिल किया था।

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

स्कैला 2.11 की तुलना में, नई योजना का लाभ यह है कि संकलक अब प्रत्येक लैम्ब्डा के लिए अज्ञात वर्ग उत्पन्न नहीं करता है। इससे काफी कम जार फाइलें होती हैं।

7

आप संभावना अंतर्निहित रूपांतरणएक लाcollection.JavaConversions या नहीं, वे बॉक्स से बाहर आने का उपयोग कर अत्यंत आसानी से कर सकेंगे।

बेशक

, इस तो है स्पष्ट रूप से नहीं है, क्योंकि यह मामला है कि जावा बंद प्रकार जो क्रम पर JVM द्वारा उत्पन्न हो में बदल रहे हैं हो सकता है - मैं एक नील Gafter प्रस्तुति कह कुछ के साथ याद करने लगते हैं इन लाइनों

15

मुझे लगता है कि यहां हितधारकों के दो समूह होने के मुकाबले यह अधिक जटिल है। Project Lambda लोग ज्यादातर ओरेकल लोगों, occasionally throwing something over the wall से स्वतंत्र रूप से काम कर रहे प्रतीत होते हैं कि परियोजना लैम्ब्डा लोग अप्रत्यक्ष रूप से पता लगाते हैं। (स्काला, तीसरे हितधारक निश्चित रूप से है।)

latest Project Lambda proposal के बाद से सभी को एक साथ समारोह प्रकार समाप्त करने के लिए, और सिर्फ इंटरफेस एक भी astract विधि (सैम प्रकार) है कि लागू करने के लिए फैंसी निष्कर्ष के कुछ प्रकार बनाने है, मैं निम्नलिखित पूर्वानुमान:

  • स्काला कोड है कि एक स्काला बंद की आवश्यकता है Function* लक्षण के कार्यान्वयन (और सामान्य रूप में लक्षण के कार्यान्वयन) पर पूरी तरह से निर्भर करेगा कॉलिंग - चाहे वह एक के रूप में जावा के लिए प्रकट होता सैम (जो स्केल-भूमि में है) या गैर-अमूर्त विधियां भी JVM के लिए सार दिखाई देती हैं। (मुझे लगता है कि वे वर्तमान में अमूर्त हैं क्योंकि लक्षण इंटरफेस के रूप में लागू किए जाते हैं, लेकिन मुझे स्कैला के कार्यान्वयन के बारे में लगभग कुछ भी पता नहीं है। यह इंटरफेरबिलिटी के लिए एक बड़ा बाधा हो सकता है।)

    जावा जेनरिक के साथ जटिलताओं (विशेष रूप से Int/int/Integer, या Unit/Nothing/void एक सामान्य इंटरफ़ेस में व्यक्त करने के लिए कैसे चीजों को जटिल कर सकते हैं।

  • जावा सैम को लागू करने के लिए स्कैला फ़ंक्शंस का उपयोग करना अब इससे अलग नहीं होगा - आपको उस विशिष्ट इंटरफ़ेस के लिए implicit रूपांतरण बनाना होगा, जिसे आप कार्यान्वित करना चाहते हैं।

यदि JVM फ़ंक्शन प्रकार प्राप्त करता है (और ओरेकल उस संभावना को समाप्त नहीं करता है), तो यह निर्भर हो सकता है कि यह कैसे कार्यान्वित किया गया है। यदि वे किसी विशेष इंटरफ़ेस को लागू करने वाली प्रथम श्रेणी की वस्तुएं हैं, तो स्कैला को संगत होने के लिए आवश्यक सभी को Function* नया इंटरफ़ेस लागू करना है।यदि पूरी तरह से JVM में एक नया प्रकार लागू किया गया है, तो यह मुश्किल हो सकता है - स्कैला डेवलपर उन्हें जादू का उपयोग करके लपेट सकते हैं जैसे कि वे वर्तमान में Array एस के लिए करते हैं, या वे implicit रूपांतरण बना सकते हैं। (एक नई भाषा की अवधारणा एक सा दूर से प्राप्त किए गए लगता है।)

मुझे आशा है कि इस चर्चा के सभी के परिणामों में से एक है कि कि विभिन्न JVM भाषाओं कुछ मानक तरीका बंद का प्रतिनिधित्व करने पर सहमत होंगे के सभी - ताकि स्कैला, ग्रोवी, जेआरबी, इत्यादि ... सभी कम से कम परेशानी के साथ आगे और पीछे बंद हो सकते हैं।

मेरे लिए और अधिक दिलचस्प क्या है virtual extension methods के लिए प्रस्ताव है जो जावा कलेक्शन एपीआई को लैम्बडास का उपयोग करने की अनुमति देगा। इन्हें कैसे कार्यान्वित किया जाता है, इस पर निर्भर करते हुए, वे स्केल कोड को बदलने के दौरान निपटने के लिए बाइनरी संगतता समस्याओं में से कुछ को सरल बना सकते हैं, और वे लक्षणों को अधिक आसानी से और कुशलतापूर्वक कार्यान्वित करने में मदद कर सकते हैं।

मुझे उम्मीद है कि कुछ स्कैला डेवलपर्स शामिल हो रहे हैं और अपना इनपुट दे रहे हैं, लेकिन मैंने वास्तव में परियोजना लैम्ब्डा सूचियों पर स्कैला की कोई चर्चा नहीं देखी है, न ही कोई भी प्रतिभागियों जो स्केल डेवलपर्स के रूप में मेरे पास कूदते हैं।

+0

धन्यवाद! आपका जवाब बहुत अच्छा है। ओरेकल सबसे अच्छा काम होगा यदि ओरेकल सिर्फ स्कैला के फंक्शनएक्स कक्षाओं को अपनाएगा ताकि चीजें बिना किसी जादू के अंतःक्रियाशील हों। लेकिन मुझे लगता है कि वे कुछ भी करने की कोशिश करेंगे _not_ ऐसा करते हैं। – soc

+0

@soc: स्कैला की फंक्शंस कक्षाएं कई स्कैला-विशिष्ट पुनर्मिलन के लिए अच्छी तरह से काम करती हैं: (1) हमारी प्रकार प्रणाली प्राथमिकताओं और बक्से वाले प्रकारों के बीच भेद को छुपाती है, और प्रकार में 'शून्य'/'यूनिट 'और' कुछ भी नहीं 'फिट कर सकती है स्वाभाविक रूप से प्रणाली। (2) परिभाषा साइट कॉन्वर्सिस हमें केवल सामान्य रूप से 'जेनिक्स का उपयोग करके' प्राकृतिक रूप से 'FuctionX' पास करने देता है, और जावा डेवलपर्स को इसे लागू करने के लिए अपने प्रकार के सिस्टम में मूल रूप से नई अवधारणा को लागू करने की आवश्यकता महसूस हो सकती है। (मुझे लगता है कि यही कारण है कि परियोजना लैम्ब्डा एक फ़ंक्शन प्रकार के विचार को त्याग रही है।) –

+4

@soc: उसने कहा, मैं परियोजना जेम्ब्डा द्वारा अन्य जेवीएम निर्वाचन क्षेत्रों के साथ चर्चा की स्पष्ट कमी से परेशान हूं। –

संबंधित मुद्दे