InсовместимыйClassChangeError: найден интерфейс, но класс ожидалсяJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 InсовместимыйClassChangeError: найден интерфейс, но класс ожидался

Сообщение Anonymous »

Я получаю отчеты о сбоях из моего приложения для Android. Они начались, когда я вызвал метод частного интерфейса из метода по умолчанию. Исходный код огромен, поэтому вот упрощенная версия:

Код: Выделить всё

public interface MyInterface {
private void myPrivateMethod() {
// ... Some code ...
}
default void interfaceMethod() {
myPrivateMethod();
}
}
Вот сгенерированный байт-код (запутанный, извините!):

Код: Выделить всё

 public s() { //()V
aload0 // reference to self
invokespecial c1/q.o()V
return
}
Я получаю следующее исключение:

java.lang.InсовместимыйClassChangeError: найден интерфейс c1.q, но класс был ожидается

на c1.q.s (неизвестный источник: 1)

Похоже, что ignorespecial используется вместо ignoreinterface, когда this является интерфейсом, а не классом.

Код: Выделить всё

interfaceMethod
вызывается следующим образом:

Код: Выделить всё

public interface MyClass implements MyInterface {
@Override public void interfaceMethod() {
MyInterface.super.interfaceMethod();

// ... other code ...
}
}
Все — это код моего проекта. Я не вызываю никакие библиотеки в этом процессе, это просто мой код вызывает мой код, поэтому я не понимаю, как возникла эта проблема.
Я не уверен, кто это делает здесь ошибка, и я не могу воспроизвести проблему, несмотря ни на что. Я сомневаюсь в R8, но у меня есть отчеты о сбоях только с нескольких устройств. У нас есть несколько отчетов с одних и тех же устройств, поэтому создается впечатление, что приложение на них постоянно дает сбой. Все устройства довольно новые и работают под управлением Android 14.
Я подумываю превратить myPrivateMethod в статический метод в следующем выпуске, но мне бы хотелось получить объяснение.

Подробнее здесь: https://stackoverflow.com/questions/790 ... s-expected
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»