2016-04-22 52 views
2

在我的項目,我嘗試使用Retrolambda插件和輕型-流API繞過代碼兼容性使用在Android應用程序用Java編寫的8碼。源項目在Java平臺上運行良好(澄清)。安卓的NoSuchMethodError用靜態方法接口(使用Retrolambda)

代碼移植到Android後,我纔不得不做出的代碼稍加修改(主要是關於讓com.annimon.stream.Stream類的實例,因爲數組和集合在Android中缺少方法.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延伸AItemContainer延伸ANamed,實施INamed)。

所以我真的不明白,問題是什麼。我懷疑Retrolambda插件不工作完全相同如Java 8確實,但無法分辨哪些改變,以及如何?另外,問題可能是在其他地方完全,我只與Android開始...

如果需要,我可以提供更多的代碼,但我認爲所有重要的東西都已經被告知。預先感謝您的幫助。

+0

來自INamed.getO()的流是否與com/annimon/stream/Stream相同?而不是JDK – Blitzkr1eg

+0

在我的所有類'com.annimon.stream.Stream;'被導入... JDK之一,因爲它不包括在Android庫中甚至不能工作... – Ellrohir

回答

6

問題解決:我發現它是Retrolambda的錯 - 或者更確切地說是我的錯。我忽略了一個事實,我必須啓用build.gradle

在Retrolambda的配置爲默認和靜態方法,支持簡單的代碼是這樣:

retrolambda { 
    defaultMethods true 
} 

我這樣做,Retrolambda做了所有的後端後東西和方法正在被發現。

+3

它值得讀你失去了什麼啓用此功能。它會嚴重影響我的構建時間,所以我再次禁用了defaultMethods。 https://github.com/orfjackal/retrolambda#known-limitations –

+0

感謝您指出這@MauriceGavin。對於正在考慮在Android中使用靜態或默認界面方法的人來說,這非常重要。 –