Как заставить Kotlin прекратить использование аргумента для неправильного класса (Интерфейс)

Я недавно общался с Котлином, и это было потрясающе!

Я работал с библиотекой Twitter4j, чтобы опробовать некоторые вещи с помощью API Twitter. Я написал этот код в Котлине

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)

После дальнейших исследований Tools-> Kotlin-> Show Kotlin Bytecode. Я декомпилировался на Java, но обнаружил, что это то, что генерируется.

  @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

Любые идеи, как решить, пожалуйста?

PS: Вот рабочая версия Java-кода – https://github.com/yusuke/twitter4j/blob/master/twitter4j-examples/src/main/java/twitter4j/examples/stream/PrintSampleStream.java

PPS: Я использую Kotlin 1.1.4, на IntelliJ IDEA 2017.2.2

    Kotlin добавляет эти приведения, чтобы гарантировать, что правильный метод вызывается при работе с перегруженными методами. Проблема возникает из-за того, что public api addListener ожидает пакет-частный интерфейс StreamListener . Попытка создать такой api фактически вызывает предупреждение именно из-за этой проблемы и должна быть исправлена ​​на стороне Twitter4j.

    В Kotlin нет прямого способа исправить это, вы можете обойти проблему, используя класс помощника Java и, возможно, метод расширения:

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

    Kiskae положил хороший момент. Возможно, автор twitter4j не учитывает взаимодействия с другими языками jvm.

    Я не думаю, что исправление необходимо.

    Вы можете просто поместить свой класс в package twitter4j если вы должны использовать частный интерфейс пакета twitter4j.StreamListener из-за нежелательного кастинга.