Android: NoSuchMethodError со статическим методом в интерфейсе (с использованием Retrolambda)

В своем проекте я пытаюсь использовать код, написанный на Java 8, в приложении для Android, используя плагин Retrolambda и Lightweight-Stream-API для обхода совместимости кода. Исходный проект хорошо работает на платформе 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 расширяет AItemContainer, который расширяет ANamed, который реализует INamed).

Так что я не очень понимаю, в чем должна быть проблема. Я подозреваю, что плагин Retrolambda не работает точно так же, как Java 8, но не может сказать, что и как изменить... Также проблема может быть совершенно в другом, я только начиная с андроида...

Я могу предоставить больше кода, если это необходимо, но я думаю, что все важное было сказано. Заранее благодарю за любую помощь.


person Ellrohir    schedule 22.04.2016    source источник
comment
Является ли поток из INamed.getO() тем же com/annimon/stream/Stream? а не тот что от JDK   -  person AdrianS    schedule 22.04.2016
comment
во всех моих классах импортируется com.annimon.stream.Stream;... JDK даже не может работать, так как он не включен в библиотеку Android...   -  person Ellrohir    schedule 22.04.2016


Ответы (1)


Проблема решена: я обнаружил, что это вина Retrolambda, а точнее моя вина. Я упустил из виду тот факт, что мне нужно включить поддержку стандартных и статических методов в конфигурации Retrolambda в build.gradle

Простой код выглядит так:

retrolambda {
    defaultMethods true
}

После того, как я это сделал, Retrolambda выполнила всю внутреннюю работу, и сейчас метод находится в поиске.

person Ellrohir    schedule 25.04.2016
comment
Стоит прочитать, что вы теряете, включив эту функцию. Это настолько сильно повлияло на время сборки, что я снова отключил defaultMethods. github.com/orfjackal/retrolambda#known-limitations - person Maurice Gavin; 24.08.2016
comment
Спасибо, что указали на это @MauriceGavin. Очень важно для всех, кто рассматривает возможность использования статики или методов интерфейса по умолчанию в Android. - person Eurig Jones; 12.02.2017