2017-08-20 32 views
5

我一直在与最近的Kotlin一起玩,并且它是真棒!如何使Kotlin停止铸造参数到错误的类(界面)

我正在与Twitter4j库一起尝试Twitter API的一些东西。我在科特林

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->显示科特林字节码。我反编译为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(); 

}

科特林试图投监听到StreamListener这是私人图书馆(StatusListener其扩展)因此IllegalAccessError

任何想法如何解决好吗?

PS:这里是代码的工作Java版本 - https://github.com/yusuke/twitter4j/blob/master/twitter4j-examples/src/main/java/twitter4j/examples/stream/PrintSampleStream.java

PPS:我使用的是1.1.4科特林上的IntelliJ IDEA 2017年2月2日

回答

2

科特林将这些类型转换,以确保正确的方法在处理重载的方法时被调用。发生此问题的原因是公共api addListener需要包 - 私有接口StreamListener。尝试创建这样一个API实际上会因为这个问题而产生警告,并且应该在Twitter4j的一边进行修复。

没有直接的方法在科特林来解决这个问题,你可以使用Java助手类和可能的扩展方法解决此问题:

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


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

感谢您的回复@Kiskae。我会试试这个。实际上,它在Java中完美工作,所以不需要修复程序 – Enoobong

+0

也可以像魅力一样工作。非常感谢 – Enoobong

0

Kiskae把好点,twitter4j的也许笔者做不考虑与其他jvm语言的交互。

我不认为修复是必要的。

如果您必须使用包私有接口twitter4j.StreamListener,因为不需要的转换,您可以将您的课程放入package twitter4j

+0

感谢您的回复@aristottl!如何将我的类放入'package twitter4j'这是一个外部库。刚添加依赖到我的pom.xml – Enoobong

+0

@Enoobong你只需要创建一个名为'twitter4j'的新包。 – aristotll

+0

像魅力一样工作。非常感谢! – Enoobong