से http://www.codecommit.com/blog/scala/scala-for-java-refugees-part-6स्काला ActionListener/अज्ञात फ़ंक्शन प्रकार मेल नहीं खाता
val button = new JButton("test")
button.addActionListener{ e:ActionEvent => println("test") }
add(button)
उच्च क्रम-समारोह उदाहरण में पाया गया कि के समान कोड लागू करने के लिए प्रयास कर रहा है निम्नलिखित
error: type mismatch;
found : (java.awt.event.ActionEvent) => Unit
required: java.awt.event.ActionListener
button.addActionListener{ e:ActionEvent => println("test") }
^
इस पर सच है की ओर जाता है कम से कम मेरे सिस्टम पर स्कैला कंपाइलर संस्करण 2.7.6. फ़ाइनल के साथ। मैं एक अज्ञात एक्शनलिस्टर को स्पष्ट रूप से कार्यान्वित करने के जावा-स्टाइल तरीके में जो चाहता हूं उसे प्राप्त करने में सक्षम हूं।
button.addActionListener(new ActionListener() {
def actionPerformed(e:ActionEvent) { println("test") }
})
जहां तक मैं समझता हूँ, स्काला बतख टाइपिंग का उपयोग करने के ActionListener अनावश्यक के इस स्पष्ट कार्यान्वयन प्रस्तुत करना करने में सक्षम होना चाहिए; तो यह यहाँ क्यों काम नहीं कर रहा है? इस बिंदु पर मेरे पास बतख-टाइपिंग का कोई व्यावहारिक अनुभव नहीं है।
प्रशंसकवाद के रूप में नहीं, लेकिन यह ध्यान देने योग्य है कि ग्रोवी और विभिन्न जावा क्लोजर प्रस्तावों में उचित फ़ंक्शन प्रकारों से एकल विधि इंटरफेस में अंतर्निहित रूपांतरण शामिल थे। यह रननेबल या तुलनात्मक जैसे इंटरफेस के लिए बहुत सुविधाजनक है। स्कैला में, आपको या तो हाथ से यह रूपांतरण करने की ज़रूरत है, या इसे करने के लिए पिंपीड लाइब्रेरी पर भरोसा करना है। –
@ डेव हां ... यदि प्रकार मेल नहीं खाता है, तो ऑटो-कास्ट करें। मुझे लगता है कि यह स्पष्ट होना चाहिए कि स्कैला ने इस तरह क्यों नहीं चुना। –
ओह, निश्चित रूप से। यह केवल ग्रोवी और जावा के लिए समझ में आता है क्योंकि उनमें मौजूदा पुस्तकालयों को विस्तारित करने के किसी भी अच्छे तरीके शामिल नहीं हैं, इसलिए उन्हें विरासत जावा गैर-दर्दनाक के साथ काम करने के लिए इस ऑटो-रूपांतरण की आवश्यकता है। स्कैला में विरासत पुस्तकालयों के लिए पिंप्स हैं, और एकल पुस्तकालयों को एकल-विधि इंटरफेस पर कार्यात्मक रूपों के पक्ष में लिखने के लिए लिखा जाना चाहिए (और हो रहा है)। –