मैं इस कोटलिन फंक्शन के साथ काम कर रहा हूं। मुझे पता है कि हमारे पास mPasswordView!!.setOnEditorActionListener नामक एक फ़ंक्शन है, जो पैरामीटर TextView.OnEditorActionListener लेता है, लेकिन उसके बाद वह क्या है? हमारे पास पैरामीटर के अंदर घुंघराले ब्रैकेट हैं?

mPasswordView!!.setOnEditorActionListener(TextView.OnEditorActionListener { textView, id, keyEvent ->
    if (id == R.id.login || id == EditorInfo.IME_NULL) {
        attemptLogin()
        return@OnEditorActionListener true
    }
    false
})
2
Vlad Skurtolov 23 अप्रैल 2017, 20:15
ठीक है मेरी गलती। यह कोई फंक्शन नहीं है...
 – 
Vlad Skurtolov
23 अप्रैल 2017, 20:16

1 उत्तर

सबसे बढ़िया उत्तर

आपके उदाहरण में उपयोग की गई विशेषता एक SAM कंस्ट्रक्टर है। setOnEditorActionListener श्रोता एक OnEditorActionListener को इसके पैरामीटर के रूप में लेता है। इस इंटरफ़ेस में केवल एक ही विधि है जिसे आपको लागू करना है, जो इसे एकल सार विधि (एसएएम) इंटरफ़ेस बनाता है।

जावा में इस पद्धति का उपयोग करने के लिए पूर्ण सिंटैक्स होगा:

mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        attemptLogin();
        return true;
    }
});

कोटलिन में एक-से-एक रूपांतरण आपको देगा:

mPasswordView.setOnEditorActionListener(object: TextView.OnEditorActionListener{
    override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean {
        attemptLogin()
        return true
    }
})

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

mPasswordView.setOnEditorActionListener { v, actionId, event ->
    attemptLogin()
    true
}

एसएएम रूपांतरण स्वचालित रूप से यह निर्धारित करता है कि यह लैम्ब्डा किस इंटरफ़ेस से मेल खाता है, लेकिन आप इसे एसएएम कन्स्ट्रक्टर नामक किसी चीज़ का उपयोग करके स्पष्ट रूप से निर्दिष्ट कर सकते हैं, यह आपके नमूना कोड में है। एक एसएएम कंस्ट्रक्टर एक ऑब्जेक्ट देता है जो दिए गए इंटरफ़ेस को लागू करता है, और आपके द्वारा पास किए गए लैम्ब्डा को इसकी एकल विधि का कार्यान्वयन बनाता है।

mPasswordView.setOnEditorActionListener( TextView.OnEditorActionListener { v, actionId, event ->
    attemptLogin()
    true
})

यह इस विशिष्ट स्थिति में बेमानी है, क्योंकि केवल एक ही विधि है जिसे setOnEditorActionListener कहा जाता है। लेकिन अगर इसी नाम के साथ कई तरीके थे, जो पैरामीटर के रूप में अलग-अलग इंटरफेस लेते थे, तो आप एसएएम कंस्ट्रक्टर का उपयोग यह निर्दिष्ट करने के लिए कर सकते हैं कि आप किस विधि को कॉल करना चाहते हैं।

सैम रूपांतरणों के बारे में आधिकारिक दस्तावेज़

9
zsmb13 23 अप्रैल 2017, 20:37
1
और @OnEditorActionListener की क्या आवश्यकता है?
 – 
azizbekian
24 अप्रैल 2017, 18:54
1
उस सिंटैक्स का उपयोग यह निर्दिष्ट करने के लिए किया जा सकता है कि यदि आपके पास नेस्टेड फ़ंक्शन हैं तो आप किस फ़ंक्शन से लौट रहे हैं। यहां देखें: kotlinlang.org/docs/reference/returns.html#return -at-लेबल. मेरा मानना ​​​​है कि हालांकि इस विशिष्ट मामले में यह वास्तव में बेमानी है।
 – 
zsmb13
24 अप्रैल 2017, 19:00