Android:接口中使用静态方法的NoSuchMethodError(使用Retrolambda)

时间:2016-04-22 07:58:55

标签: java android retrolambda

在我的项目中,我尝试使用 Retrolambda 插件和 Lightweight-Stream-API 在Android应用中使用Java 8编写的代码来绕过代码兼容性。源项目在Java平台上运行良好(澄清)。

将代码移植到Android之后,我只需对代码进行一些修改(主要是关于获取com.annimon.stream.Stream类的实例,因为Android中的数组和集合缺少方法.stream()所以我需要使用带有数组/集合作为参数的Stream类的静态方法,但这甚至不应该是我的问题的关注点。目前没有编译错误,应用程序启动,工作,但在调用时崩溃:

Optional<Room> result = INamed.getO(name, Stream.of(rooms));

出错:

FATAL EXCEPTION: main

Process: cz.alois_seckar.vseadventrura, PID: 8109

java.lang.NoSuchMethodError: No static method getO(Ljava/lang/String;Lcom/annimon/stream/Stream;)Lcom/annimon/stream/Optional; in class Lcz/alois_seckar/vseadventrura/eu/pedu/adv16s_fw/game_txt/INamed; or its super classes (declaration of 'cz.alois_seckar.vseadventrura.eu.pedu.adv16s_fw.game_txt.INamed' appears in /data/data/cz.alois_seckar.vseadventrura/files/instant-run/dex/slice-slice_1-classes.dex)
    at cz.alois_seckar.vseadventrura.eu.pedu.adv16s_fw.test_util.default_game_txt.game.Apartment.getORoom(Apartment.java:166)
    at cz.alois_seckar.vseadventrura.eu.pedu.adv16s_fw.test_util.default_game_txt.game.Room$$Lambda$1.apply(Unknown Source)
    at com.annimon.stream.Stream$12.nextIteration(Stream.java:539)
    ...

课程Room通过其祖先INamed扩展Room来实现AItemContainerANamed扩展INamed实现{{1}}。

所以我真的不明白,问题是什么。我怀疑 Retrolambda 插件不能像Java 8那样工作完全相同但是无法告诉要改变什么以及如何......问题可能完全在别处,我是只从Android开始...

如果需要,我可以提供更多代码,但我认为一切都很重要。提前感谢您的帮助。

1 个答案:

答案 0 :(得分:6)

问题解决了:我发现这是Retrolambda的错 - 或者说是我的错。我忽略了这样一个事实:我必须在Message

中的Retrolambda配置中启用对默认和静态方法的支持

简单的代码如下:

build.gradle

在我这样做之后,Retrolambda做了所有的后端工作,现在正在找到这种方法。