2016-02-25 7 views
15

मैं कोटलिन को अपने वर्तमान प्रोजेक्ट में पेश करने की कोशिश कर रहा हूं। मैंने संस्थाओं के साथ शुरू करने का फैसला किया है, जो डेटा वर्गों के लिए पूरी तरह से मानचित्रण करने लगते हैं।जावा इंटरफेस को लागू करने वाले कोटलिन डेटा क्लास

data class Video(val id: Long, val ownerId: Long, val title: String, val description: String? = null, 
      val imgLink: String? = null, val created: Date? = null, val accessKey: String? = null, 
      val views: Long? = null, val comments: Long? = null, val videoLink: String? = null): Entity 

कौन सा जावा इंटरफ़ेस लागू करता है::

public interface Entity { 
    Long getId(); 
} 

लेकिन किसी कारण संकलक कि विधि नहीं समझती के लिए पहले से ही लागू किया गया है:

कक्षा उदाहरण के लिए मैं एक डेटा वर्ग है 'वीडियो' को अमूर्त घोषित किया जाना चाहिए या अमूर्त सदस्य सार्वजनिक अमूर्त मज़ा प्राप्त करें ID(): kotlin.Long! net.alfad.data.Entity

क्या मुझे आईडी पैरा के लिए कोई अतिरिक्त कीवर्ड उपयोग करना है? क्या करता है "!" हस्ताक्षर में मतलब है?

+0

कोटलिन 1.0.0 – Odysseus

+0

'! का उपयोग करते हुए हस्ताक्षर में इसका मतलब है कि यह एक प्लेटफॉर्म प्रकार है, यानी जावा से आने वाला एक प्रकार है। आप इसके बारे में अधिक जानकारी प्राप्त कर सकते हैं [डॉक्स में] (http://kotlinlang.org/docs/reference/java-interop.html#notation-for-platform-types) –

उत्तर

24

समस्या यह है कि कोटलिन जावा क्लास Entity पहले लोड करता है और यह एक प्रॉपर्टी के रूप में getId को कुछ संपत्ति के गेटर के रूप में नहीं देखता है। कोटलिन क्लास में एक संपत्ति गेटर एक समारोह को ओवरराइड नहीं कर सकता है, इसलिए id संपत्ति getId फ़ंक्शन के कार्यान्वयन के रूप में बाध्य नहीं है।

इसे हल करने के लिए, आपको अपने कोटलिन कक्षा में मूल फ़ंक्शन getId ओवरराइड करना चाहिए। ऐसा करने से आपके नए कार्य और बाईटकोड में id के गेटर के बीच JVM हस्ताक्षर संघर्ष का परिणाम देगा, ताकि आप भी संपत्ति private बनाकर गेटर पैदा करने से संकलक रोकने चाहिए:

data class Video(
    private val id: Long, 
    ... 
) { 
    override fun getId() = id 

    ... 
} 

नोट इस जिसका उत्तर यहां से अनुकूलित किया गया है: https://stackoverflow.com/a/32971284/288456

+0

अच्छा जवाब! एक और बात: क्या इसका मतलब यह है कि जावा में गेटर्स/सेटर नियमित तरीके नहीं हैं? – Odysseus

+0

परिणामी बाइटकोड में, और जावा के दृष्टिकोण से, वे वही हैं। एक संपत्ति गेटर को 'getXxx' नामक विधि से संकलित किया जाता है। लेकिन कोटलिन (संस्करण 1.0.0) के लिए, संपत्ति एक्सेसर्स और फ़ंक्शंस अलग हैं और आप दोनों को पदानुक्रम में मिश्रित नहीं कर सकते हैं। –

+0

क्या इसे बदलने के बारे में कोई चर्चा है? क्या कोई कारण नहीं है कि यह सिर्फ _work_ नहीं होना चाहिए? –

1

यदि यह आपकी संपूर्ण डेटा क्लास है तो आप getId() को ओवरराइड नहीं कर रहे हैं। मैं देखता हूं कि आपके पास आईडी नामक एक संपत्ति है और कोटलिन को इसके लिए गेटटर उत्पन्न करना चाहिए, लेकिन इसे ओवरराइड कीवर्ड के साथ चिह्नित नहीं किया जाएगा जिसे आपको यह इंगित करने की आवश्यकता है कि आप एक अमूर्त फ़ंक्शन को ओवरराइड कर रहे हैं।

- संपादित करें - अलेक्जेंडर ने मुझे इसे हराया! उसका जवाब वैसे भी बेहतर है! ;)

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