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, но не может сказать, что изменить и как... Кроме того, проблема может быть совершенно в другом месте, я только начинаю с Android...
Я могу предоставить больше кода, если это необходимо, но я думаю, что все важное было сказано. Заранее благодарю за любую помощь.
1 ответ
Проблема решена: я обнаружил, что это вина Ретроламбды - точнее, моя вина. Я упустил из виду тот факт, что я должен включить поддержку стандартных и статических методов в конфигурации Retrolambda в build.gradle
Простой код выглядит так:
retrolambda {
defaultMethods true
}
После того, как я это сделал, Retrolambda сделала все, что нужно, и метод сейчас находится в поиске.