2016-02-16 7 views
11

मैंने कोटलिन और आरएक्सजेवा का उपयोग करके अपने एंड्रॉइड ऐप में एक समस्या में भाग लिया है। यह नीचे प्रस्तुत किया गया है।कोटलिन आरएक्सजेवा न्यूलबल बग

import rx.Observable 

data class TestUser(val name: String) 

fun getTestUser(): Observable<TestUser> { 
    return Observable.just(TestUser("Brian")).flatMap { getUser() } // this compiles 
} 

fun getTestUser2(): Observable<TestUser> { 
    val observable = Observable.just(TestUser("Brian")).flatMap { getUser() } 
    return observable // this does not compile 
} 

fun getUser(): Observable<TestUser?> { 
    return Observable.just(null) 
} 

getTestUser2 में, संकलक Observable<TestUser?> के रूप में अंतिम वापसी प्रकार infers और संकलन नहीं है। हालांकि getTestUser में कोड संकलित करता है, और जब यह चलाया जाता है, तो उस पर्यवेक्षक के किसी भी ग्राहक को आश्चर्य की बात हो सकती है जब TestUsernull वापस आता है।

मुझे लगता है कि यह कोटलिन और जावा के बीच आगे और आगे जाने के साथ कुछ करने का अनुमान है। लेकिन, तथ्य यह है कि कंपाइलर getTestUser2 में अंतर देख सकता है मुझे लगता है कि यह ठीक हो सकता है।

संपादित

यह Kotlin 1.0, बस कल जारी की अंतिम संस्करण (फरवरी 15, 2016) पर है।

+0

मुझे लगता है, इस समस्या ट्रैकर वे उपयोग कर रहे है: https://youtrack.jetbrains.com/issues/KT । यदि आप एक बग रिपोर्ट –

+2

बनाते हैं तो आप भाषा के रचनाकारों से पुष्टि/स्पष्टीकरण प्राप्त करने की अधिक संभावना रखते हैं। टीम ने पुष्टि की है कि यह एक बग है। समस्या: https://youtrack.jetbrains.com/issue/KT-11108 – voddan

उत्तर

10

flatMap समारोह के हस्ताक्षर जब Kotlin में इस्तेमाल इस प्रकार है:

जावा में कोई संदर्भ null हो सकता है, Kotlin की आवश्यकताओं सख्त की बनाता है:

public final fun <R: Any!, T: Any!> 
    Observable<T>.flatMap(
     func: ((T) -> Observable<out R!>!)! 
    ) : Observable<R!>! 
डॉक्स से

जावा से आने वाली वस्तुओं के लिए शून्य-सुरक्षा अव्यवहारिक। जावा घोषणाओं के विशेष रूप से कोटलिन में इलाज किए जाते हैं और प्लेटफार्म प्रकार कहा जाता है। अशक्त-जांच करता है इस तरह के प्रकार के लिए आराम कर रहे हैं, तो उनके लिए है कि सुरक्षा की गारंटी देता है जावा

और

में जैसे ही हैं

T! का अर्थ है "T या T?"

यह साधन कि कोटलिन कंपाइलर flatMap फ़ंक्शन के रिटर्न प्रकार को Observable<TestUser> या Observable<TestUser?> या यहां तक ​​किके रूप में देख सकता है 0। विश्राम भाग इतना कहता है, "हम आपको इन अज्ञात प्रकारों से परेशान नहीं करना चाहते हैं, शायद आप बेहतर जानते हैं"।

चूंकि वापसी प्रकार स्पष्ट रूप से getTestUser() में दिया गया है, यह पहले का उपयोग करता है। चूंकि observable का प्रकार स्पष्ट रूप से दिया गया है, तो getUser() फ़ंक्शन के आधार पर यह Observable<TestUser?> पर इसका अनुमान लगाता है।


@voddan टिप्पणी की हैं, वहाँ इस समस्या पर चर्चा एक खुला मुद्दा है: https://youtrack.jetbrains.com/issue/KT-11108

+0

इसे स्वीकार किया गया। अच्छी तरह से शोध और प्रस्तुत किया। यह समझ आता है। मैं शायद दूसरे उदाहरण में इसे वापस करने से पहले मान निर्दिष्ट करके अधिक स्पष्ट होना शुरू कर दूंगा।मैं चाहता हूं कि मैं सभी प्रकार की सुरक्षा प्राप्त कर सकूं। – bclymer

+1

यह अजीब है। किसी प्रकार की घोषणा के बिना असाइनमेंट में कोई चीज़ नहीं बदली जानी चाहिए। – voddan

+2

टीम ने पुष्टि की कि यह एक बग है। मुद्दा: https://youtrack.jetbrains.com/issue/KT-11108 – voddan