2014-10-22 9 views
22

पर विचार करें निम्नलिखित जावा वर्ग:लैम्ब्डा भाव

public class SomeClass { 
    public interface Something { 
     void doSomething(); 
    } 

    public void call(Something something) {} 
} 

Kotlin में, मैं एक लैम्ब्डा अभिव्यक्ति के रूप में इस का उपयोग कर सकते हैं:

SomeClass().call { 
    // do something 
} 

लेकिन अगर मैं Kotlin में निम्न विधि को परिभाषित (का उपयोग करते हुए एक ही इंटरफ़ेस):

fun call(something: Something) {} 

फिर इस कॉल:

call { 
    // do something 
} 

एक प्रकार की मेलबैक त्रुटि उत्पन्न करेगा। क्यूं कर?

उत्तर

25

Kotlin कर सकते हैं केवल, जावा तरीकों के लिए सैम रूपांतरण का समर्थन करता है क्योंकि Kotlin ही समारोह प्रकार है। आम तौर पर, कोटलिन कार्यों को Something के बजाय लेना चाहिए।

call(Something { /* do something */ }) 

किसी भी सैम प्रकार (एक सार विधि के साथ जावा इंटरफेस) स्वचालित रूप से इस तरह के एक निर्माता समारोह है कि इसके उदाहरण के लिए एक लैम्ब्डा धर्मान्तरित हो जाता है: यदि आप वास्तव में इसे जरूरत है Something लेने के लिए, आप एक सैम निर्माता का उपयोग कर सकते हैं।

+4

यह निर्णय मेरे लिए अजीब लग रहा है। 'सूची <(T) -> यूनिट>' बनाम 'सूची > 'पर विचार करें। दूसरे में अधिक जानकारी है। सौभाग्य से एक कामकाज है: हम कोटलिन परियोजनाओं में जावा कोड का स्वतंत्र रूप से उपयोग कर सकते हैं। – Yaroslav

+0

हालांकि कि वैकल्पिक हल :( – Yaroslav

+3

नाम समारोह प्रकार एक अलग कहानी है। और वे Kotlin –

8

कोटलिन की आवश्यकता है कि कॉल इंटरफ़ेस something का कुछ लेता है।

() -> Kotlin.Unit 

प्रकार की आवश्यकता को पूरा नहीं करता है।

आप इस

call (object : Something { 
    override fun doSomething() { 
     println("Passing an interface to call in kotlin!") 
    } 
}) 
संबंधित मुद्दे