【问题标题】:Android: NoSuchMethodError with static method in interface (using Retrolambda)Android:接口中带有静态方法的 NoSuchMethodError(使用 Retrolambda)
【发布时间】:2016-04-22 07:58:55
【问题描述】:

在我的项目中,我尝试使用 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 类通过其祖先实现INamedRoom 扩展AItemContainer 扩展ANamed 实现INamed)。

所以我真的不明白,这会是什么问题。我会怀疑 Retrolambda 插件不能像 Java 8 那样工作完全相同,但无法说出要改变什么以及如何改变......而且问题可能完全在其他地方,我是仅从 Android 开始...

如果需要,我可以提供更多代码,但我认为所有重要的事情都已告知。提前感谢您的帮助。

【问题讨论】:

  • 来自 INamed.getO() 的流是否相同 com/annimon/stream/Stream ?而不是来自 JDK 的那个
  • 在我的所有课程中,com.annimon.stream.Stream; 被导入...JDK 一个甚至无法工作,因为它不包含在 Android 库中...

标签: java android retrolambda


【解决方案1】:

问题已解决:我发现这是 Retrolambda 的错 - 或者更确切地说是我的错。我忽略了一个事实,即我必须在build.gradlebuild.gradle的 Retrolambda 配置中启用对默认和静态方法的支持

简单的代码如下:

retrolambda {
    defaultMethods true
}

在我这样做之后,Retrolambda 完成了所有后端工作,现在正在寻找方法。

【讨论】:

  • 启用此功能会失去什么,值得一读。它极大地影响了我的构建时间,以至于我再次禁用了 defaultMethods。 github.com/orfjackal/retrolambda#known-limitations
  • 感谢@MauriceGavin 指出这一点。对于任何考虑在 Android 中使用静态或默认接口方法的人来说非常重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
  • 2015-06-15
相关资源
最近更新 更多