2017-08-20 15 views
5

पर तर्क कास्टिंग रोकने के लिए कैसे करें मैं हाल ही में कोटलिन के साथ घूम रहा हूं, और यह बहुत बढ़िया रहा है!कोटलिन को गलत वर्ग (इंटरफ़ेस)

मैं ट्विटर एपीआई के साथ कुछ सामानों को आजमाने के लिए ट्विटर 4j लाइब्रेरी के साथ काम कर रहा था। मैं Kotlin

object Demo { 

    private val twitterStream = TwitterStreamFactory().instance 
    @JvmStatic 
    fun main(args: Array<String>) { 

     val listener = object : StatusListener { 

      override fun onStallWarning(warning: StallWarning?) { 
       println("Got stall warning:" + warning) 
      } 

      override fun onScrubGeo(userId: Long, upToStatusId: Long) { 
       println("Got scrub_geo event userId:$userId upToStatusId:$upToStatusId") 
      } 

      override fun onStatus(status: Status) { 
       println("@" + status.user.screenName + " - " + status.text) 
      } 

      override fun onDeletionNotice(statusDeletionNotice: StatusDeletionNotice) { 
       println("Got a status deletion notice id:" + statusDeletionNotice.statusId) 
      } 
      override fun onTrackLimitationNotice(numberOfLimitedStatuses: Int) { 
       println("Got track limitation notice:" + numberOfLimitedStatuses) 
      } 
      override fun onException(ex: Exception) { 
       ex.printStackTrace() 
      } 
     } 

     twitterStream.addListener(listener) 
     twitterStream.sample() 

    } 
} 

में इस कोड को लिखा था लेकिन हर बार मैं इसे भाग गया, मैं exception in thread "main" java.lang.IllegalAccessError: tried to access class twitter4j.StreamListener from class co.enoobong.eno.twitter.bot.Demo at co.enoobong.eno.twitter.bot.Demo.main(Demo.kt:63)

मिला आगे की जांच पड़ताल, उपकरण> Kotlin-> दिखाएं Kotlin Bytecode पर। मैं जावा पर डूब गया, केवल यह पता लगाने के लिए कि यह उत्पन्न किया जा रहा था।

@JvmStatic 
public static final void main(@NotNull String[] args) { 
    Intrinsics.checkParameterIsNotNull(args, "args"); 
    <undefinedtype> listener = new StatusListener() { 
    public void onStallWarning(@Nullable StallWarning warning) { 
     String var2 = "Got stall warning:" + warning; 
     System.out.println(var2); 
    } 

    public void onScrubGeo(long userId, long upToStatusId) { 
     String var5 = "Got scrub_geo event userId:" + userId + " upToStatusId:" + upToStatusId; 
     System.out.println(var5); 
    } 

    public void onStatus(@NotNull Status status) { 
     Intrinsics.checkParameterIsNotNull(status, "status"); 
     String var2 = "@" + status.getUser().getScreenName() + " - " + status.getText(); 
     System.out.println(var2); 
    } 

    public void onDeletionNotice(@NotNull StatusDeletionNotice statusDeletionNotice) { 
     Intrinsics.checkParameterIsNotNull(statusDeletionNotice, "statusDeletionNotice"); 
     String var2 = "Got a status deletion notice id:" + statusDeletionNotice.getStatusId(); 
     System.out.println(var2); 
    } 

    public void onTrackLimitationNotice(int numberOfLimitedStatuses) { 
     String var2 = "Got track limitation notice:" + numberOfLimitedStatuses; 
     System.out.println(var2); 
    } 

    public void onException(@NotNull Exception ex) { 
     Intrinsics.checkParameterIsNotNull(ex, "ex"); 
     ex.printStackTrace(); 
    } 
    }; 
    twitterStream.addListener((StreamListener)listener); 
    twitterStream.sample(); 

}

Kotlin StreamListener को श्रोता कास्ट करने के लिए कोशिश कर रहा था जो लाइब्रेरी में निजी है (StatusListener यह फैली हुई है) इसलिए IllegalAccessError

कोई भी विचार कैसे कृपया हल करने?

पुनश्च: यहाँ कोड का एक काम कर जावा संस्करण है - https://github.com/yusuke/twitter4j/blob/master/twitter4j-examples/src/main/java/twitter4j/examples/stream/PrintSampleStream.java

पी पी एस: मैं Kotlin 1.1.4, उपयोग कर रहा हूँ IntelliJ विचार पर 2017.2.2

उत्तर

2

Kotlin इन डाले कहते हैं सही विधि सुनिश्चित करने के लिए अधिभारित तरीकों से निपटने के दौरान बुलाया जाता है। समस्या तब होती है क्योंकि एक सार्वजनिक एपीआई addListener एक पैकेज-निजी इंटरफ़ेस StreamListener की अपेक्षा करता है। इस तरह की एपीआई बनाने की कोशिश वास्तव में इस समस्या के कारण चेतावनी का कारण बनती है और ट्विटर 4j की तरफ तय की जानी चाहिए।

Kotlin में इसे ठीक करने के लिए कोई सीधा तरीका नहीं है, तो आप एक जावा सहायक वर्ग और शायद एक विस्तार विधि का उपयोग कर समस्या के समाधान कर सकते हैं:

class Twitter4jFixer { 
    public static void addListener(TwitterStream stream, StatusListener listener) { 
     stream.addListener(listener); 
    } 
} 


fun TwitterStream.addListenerFixed(listener: StatusListener) { 
    Twitter4jFixer.addListener(this, listener) 
} 
+0

आपकी प्रतिक्रिया @ किस्का के लिए धन्यवाद। मैं इसे आज़माउंगा। दरअसल यह जावा में पूरी तरह से काम करता है इसलिए फिक्सर – Enoobong

+0

की कोई ज़रूरत नहीं है, ठीक आकर्षण की तरह काम किया। बहुत धन्यवाद – Enoobong

0

Kiskae एक अच्छा बिंदु डाल दिया, हो सकता है कि twitter4j के लेखक करता है खाते में अन्य जेवीएम भाषाओं के साथ बातचीत नहीं करें।

मुझे नहीं लगता कि फिक्स आवश्यक है।

यदि आप अवांछित कास्टिंग के कारण पैकेज निजी प्राइवेट इंटरफ़ेस twitter4j.StreamListener का उपयोग करना चाहते हैं तो आप अपनी कक्षा को package twitter4j पर डाल सकते हैं।

+0

आपकी प्रतिक्रिया @aristottl के लिए धन्यवाद! मैं अपनी कक्षा को 'पैकेज twitter4j' में कैसे डालूं यह बाहरी पुस्तकालय है। बस मेरे pom.xml – Enoobong

+0

@Enoobong पर निर्भरता जोड़ा गया है आपको सिर्फ 'twitter4j' नाम के साथ एक नया पैकेज बनाने की आवश्यकता है। – aristotll

+0

ठीक आकर्षण की तरह काम किया। बहुत धन्यवाद! – Enoobong

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