2015-01-19 36 views
39

में किसी विशेष उदाहरण की विधि के संदर्भ में जावा 8 में हम कक्षा के उदाहरण की विधि का संदर्भ ले सकते हैं। यहाँ एक उदाहरणकोटलिन

Function1<Integer, Object> ref = a::getItem; 

है एक वर्ग Adapter विधि Object getItem(int i) है कि का एक उदाहरण है।

क्या हम कोटलिन में भी ऐसा कर सकते हैं? मैंने सफलता के बिना एक ही वाक्यविन्यास की कोशिश की। अब तक मैं केवल इतना की तरह एक विस्तार विधि संदर्भ बनाने में सक्षम था:

val ref: Adapter.(Int) -> Any = Adapter::getItem 

लेकिन यहाँ मैं अभी भी यह आह्वान करने के लिए एक Adapter का एक उदाहरण की जरूरत है। अन्य alterantive मैं देख रहा हूँ इस तरह एक लैम्ब्डा परिभाषित करने जाता है:

val ref: (Int) -> Any = { a.getItem(it) } 
+11

कैप्चरिंग संदर्भ अभी तक समर्थित नहीं हैं, लेकिन भविष्य में –

+0

संभावित डुप्लिकेट [कोटलिन: किसी फ़ंक्शन को दूसरे पैरामीटर के रूप में कैसे पास किया जाए?] (Http://stackoverflow.com/questions/16120697/kotlin- कैसे-टू-पास-ए-फ़ंक्शन-ए-पैरामीटर-टू-सेकंड) – Ram

+0

लैम्बडा का उपयोग करने का आपका विकल्प 1.0 के रूप में वर्तमान सर्वोत्तम तरीका है, हालांकि भविष्य में यह बदलेगा कि एंड्रॉइड ब्रेस्लाव उल्लेख –

उत्तर

20

Kotlin 1.1 के बाद से, आप bound callable references उपयोग कर सकते हैं कि ऐसा करने के लिए:

val f = a::getItem 

list.forEach(myObject::myMethod) 

इससे पहले Kotlin संस्करणों डॉन ' इस सुविधा में नहीं है और आपको these simple cases को छोड़कर हर बार एक लैम्ब्डा बनाने की आवश्यकता होती है।

+1

प्रस्ताव लिंक के लिए धन्यवाद। एक कंपैनियन ऑब्जेक्ट के फ़ंक्शन के लिए, केवल यह वाक्यविन्यास काम करता है [कोटलिन 1.3 के साथ]: '(कक्षा) :: फ़ंक्शन' या 'क्लासए। कॉम्पैनियन :: फ़ंक्शन'। पहले का उपयोग केवल कोटलिन में किया जा सकता है, इसलिए जावा और कोटलिन कोड के बीच स्थिरता के लिए, यदि आपको जावा में संदर्भित करने की आवश्यकता है तो दूसरे वाक्यविन्यास का उपयोग करना बेहतर होगा। – Metallica