2017-05-10 9 views
8

मैं की तरहKotlin एक जावा वर्ग इंटरफेस: दुर्घटना ओवरराइड

public class ThirdParty { 
    public String getX() { 
     return null; 
    } 
} 

एक वर्ग के साथ एक तीसरी पार्टी जावा पुस्तकालय है मैं भी तरह

interface XProvider { 
    val x: String? 
} 

kotlin में एक अंतरफलक है अब मैं विस्तार करना चाहते ThirdParty कक्षा और XProvider इंटरफ़ेस को लागू करें। यह ठीक मेरी विरासत जावा कोड में काम कर दिया गया है:

public class JavaChild extends ThirdParty implements XProvider {} 

हालांकि, मैं जितना संभव हो उतना kotlin लिखने के लिए चाहते हैं और मेरे जावा वर्गों kotlin में बदलने की कोशिश कर रहा हूँ। दुख की बात है, निम्नलिखित काम नहीं करता:

class KotlinChild: ThirdParty(), XProvider 

त्रुटि

class 'KotlinChild1' must be declared abstract or implement abstract member public abstract val x: String? defined in XProvider 

है हालांकि, अगर मैं ऐसा कुछ

class KotlinChild1: ThirdParty(), XProvider { 
    override val x: String? = null 
} 

जैसे मैं

error: accidental override: The following declarations have the same JVM signature (getX()Ljava/lang/String;) 
    fun <get-x>(): String? 
    fun getX(): String! 
     override val x: String? = null 

मिल क्या काम करता है निम्नलिखित बदसूरत काम-आसपास:

class KotlinChild: JavaChild() 
+0

आपने क्या त्रुटि मिलता है? – marstran

+0

क्षमा करें, भूल गया। मैंने प्रश्न – dpoetzsch

+0

को अद्यतन किया [संभावित कोटलिन में दुर्घटनाग्रस्त ओवरराइड त्रुटियों को हल करना] (http://stackoverflow.com/questions/32970923/resolving-accidental-override-errors-in-kotlin) – mfulton26

उत्तर

2

आपके पास XProvider इंटरफ़ेस और थर्डपार्टी (सार) वर्ग के बीच एक नामकरण संघर्ष है। यह मेरा Kotlin compililer जो एक वैध जावा विधि में

val x: String? 

संकलित क्योंकि जावा चर या संपत्तियों की विरासत का समर्थन नहीं करता कारण होता है। वैध जावा विधि का नाम "getX()" होगा। तो आपके पास XProvider.getX() और ThirdParty.getX() विधि के बीच एक संघर्ष है। इसलिए समाधान आपके XProvider वर्ग में आपकी संपत्ति "x" का नाम बदल सकता है। या आप एक दूसरी कक्षा बनाते हैं जिसमें थ्रिडपार्टी का एक उदाहरण होता है और XProvider लागू करता है। जब वैल एक्स: स्ट्रिंग कहा जाता है तो आप इसे अपने थर्डपार्टी इंस्टेंस से प्राप्त करके सामग्री प्रदान कर सकते हैं।

उदाहरण:

class ThirdPartyImpl: XProvider { 
    private val thridPartyInstance = ThridParty() 
    override val x: String? = thirdPartyInstance.x 
} 
+1

मैं समस्या को समझता हूं और अपना कामकाज देखता हूं। मेरे पास जावा में 'थर्डपार्टी' (मेरे मामले में 'पार्सऑब्जेक्ट') में बहुत से उप-वर्ग हैं, जिन्हें मैं अब कोटलिन में परिवर्तित करने की कोशिश कर रहा हूं और यही वह समस्या है जहां समस्या हुई। आपका समाधान न केवल बहुत सारे कोड को बदलने का मतलब होगा बल्कि मेरी लाइब्रेरी के बाहरी इंटरफ़ेस ('XProperty') को भी बदल देगा। – dpoetzsch

+0

दूसरे समाधान के बारे में क्या है? –

+0

रैपर दृष्टिकोण का अर्थ यह होगा कि मुझे अपनी सार्वजनिक परियोजनाओं में आंतरिक रूप से उपयोग करने वाली सभी सार्वजनिक विधियों को लपेटना होगा, जो मेरी राय में बहुत बदसूरत है। – dpoetzsch

संबंधित मुद्दे