2015-11-19 39 views
9

में जावा शून्य प्रकार का उपयोग करना मेरे पास एक जावा फ़ंक्शन है जिसके लिए मुझे टाइप बाधाओं के कारण Void पैरामीटर पारित करने की आवश्यकता है। कुछ की तरह:कोटलिन

void foo(Void v) { 
    // do something 
} 

अब मैं Kotlin से कि समारोह कॉल करना चाहते हैं, लेकिन संकलक शिकायत है कि प्रकार के संगत जब मैं null से कॉल करने की जैसे मैं जावा से होगा नहीं हैं:

foo(null); 

मुझे उस फ़ंक्शन को पास करने के लिए क्या करना है ताकि कोटलिन कंपाइलर इसे स्वीकार कर सके?

अद्यतन: वास्तविक कोड इस तरह दिखता है:

fun foo(): Map<String, Void> { 
    return mapOf(Pair("foo", null)) 
} 

अद्यतन: का उपयोग कर null as Void वास्तव में या तो काम नहीं करता है: अपने Kotlin प्लगइन अद्यतन करने के लिए

kotlin.TypeCastException: null cannot be cast to non-null type java.lang.Void 
+0

आप trie है डी परिवर्तक को हाथ से पहले शून्य करने के लिए सेटिंग? क्या एक आईएनटी या ऑब्जेक्ट का उपयोग कर कार्य है? यदि ऐसा है तो आप इसे कोशिश करने और इसे बदलने या इसे बदलने से पहले इसे पूर्ण पर सेट कर सकते हैं। क्या यह एक तरीका है जिसे आप बुला रहे हैं या क्या आप इसे किसी अन्य वर्ग से विरासत में ले रहे हैं? – colt

+0

असल में मैं एक ऐसा फ़ंक्शन विरासत में प्राप्त कर रहा हूं जिसे 'मानचित्र <स्ट्रिंग, शून्य>' वापस लौटाया जाना चाहिए और 'वापस लौटना चाहते हैं' (air ("foo", null)) ' – TBieniek

+0

कंपाइलर द्वारा दिया गया सही त्रुटि संदेश क्या है? मैं एक अलग नमूने में समस्या को पुन: उत्पन्न करने में सक्षम नहीं था, यानी आप 'शून्य' पैरामीटर –

उत्तर

3

प्रयास करें। मैं '1.0.0 बीटा-1103-IJ143-27' पर हूँ और निम्नलिखित कोड कोई शिकायत/चेतावनी के बिना संकलित: अपने पर

// On Java side 
public class Test { 
    public void test(Void v) { 

    } 
} 

// On Kotlin side 
fun testVoid() { 
    Test().test(null) 
} 
+1

मेरी प्लगइन वास्तव में और भी अद्यतित है: '1.0.0-beta-2423-IJ143-13' लेकिन समस्या अभी भी – TBieniek

+0

बनी हुई है मेरे पास एजीए (' 1.0.0-बीटा-1103- IJ143-27')। मैं 'इंटेलिजे आईडीईए सामुदायिक संस्करण 15.0.1' का उपयोग कर रहा हूं, और मेरे पर्यावरण में एगा कार्यों द्वारा पोस्ट किया गया कोड। – Eric

6

यह कोशिश करने का मौका नहीं हुई है, लेकिन आधारित विशुद्ध अपवाद निम्नलिखित कोड काम करना चाहिए:

fun foo(): Map<String, Void?> { 
    return mapOf(Pair("foo", null)) 
} 

स्पष्टीकरण: Map<String, Void> वहाँ उम्मीद कर रही है कोई null मूल्यों किया जाना है। लेकिन आप को null मान के साथ बना रहे हैं। लोग null जो जहाँ तक मुझे पता है कर रहा हूँ काम करना चाहिए साथ Void की आवश्यकता होती है जावा विधि लागू सुझाव दे रहे हैं, लेकिन Pair निर्माता के लिए उपयोग कर रहे हैं आप निश्चित रूप से स्पष्ट रूप से यह है कि Map अशक्त मान हो सकते हैं की जरूरत है।

संपादित करें: नेक्रो-आईएनजी के लिए मेरा बुरा, बाद तक तारीख के बारे में नहीं सोचा था। :(

+1

यह स्वीकार्य उत्तर होना चाहिए। यदि आप शून्य पास करना चाहते हैं तो निश्चित रूप से एक शून्य प्रकार का उपयोग करें। – Rocoty

+0

यह एक विशेष मामला है जो मुझे लगता है कि कोटलिन को संभालना चाहिए। शून्य प्रकार हमेशा शून्य होगा – jontro

0

2 समाधान, उन दोनों को संकलित करता है (Kotlin 1.1.2-3 से कम) के साथ आया था

आप (अपने विधि हस्ताक्षर नहीं बदल रहा है, लेकिन यह काम नहीं करता है) यह आवश्यकता हो सकती है।:

fun foo(): Map<String, Void> { 
    return mapOf(Pair("foo", throw Exception("Why? Why you call me"))) 
} 

या की तरह (अपने हस्ताक्षर बदल रहा है और यह काम करता है) कुछ:।

fun foo(): Map<String, Void?> { 
    return mapOf(Pair("foo", null as Void?)) 
} 

गुड लक