Подтвердить что ты не робот

Ошибка Java: найден интерфейс... но класс ожидался

Я получаю странную ошибку времени выполнения из моего кода:

"Found interface [SomeInterface] but class was expected"

Как это может произойти? Как можно получить экземпляр интерфейса?

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

Проблема исчезла, когда я привязал реализацию к интерфейсу (похоже, аннотация @ImplementedBy была недостаточной).

Меня больше интересовала механика, благодаря которой Guice удалось фактически создать интерфейс.

4b9b3361

Ответ 1

Это происходит, когда ваш путь к среде выполнения отличается от пути к классу времени компиляции.

Когда ваше приложение было скомпилировано, класс (с именем SomeInterface в вашем вопросе) существовал как класс.

Когда ваше приложение запускается во время компиляции, SomeInterface существует как интерфейс (вместо класса.)

Это вызывает сброс IncompatibleClassChangeError во время выполнения.

Это обычное явление, если у вас была другая версия файла jar на пути класса компиляции, чем на пути к среде выполнения.

Ответ 2

Скорее всего, код был скомпилирован против класса в библиотеке, который затем был изменен на интерфейс в версии, с которой вы выполняете.

Ответ 3

Похоже, ты сделал

class MyClass extends SomeInterface

когда это действительно должно быть

class MyClass implements SomeInterface

Я прав?

EDIT: О, вы говорите, что это ошибка времени выполнения, а не ошибка времени компиляции? Позвольте мне немного оглянуться...

ИЗМЕНИТЬ 2: Похоже, у Джареда есть правильный ответ. В любом случае, попытка расширения интерфейса фактически даст сообщение "no interface expected here" во время компиляции, а не "обнаруженный интерфейс, но ожидаемый класс".

Ответ 4

У меня была та же проблема. Я использую две библиотеки jar в своем приложении. Одна библиотека построена на другой.

Библиотека A определяет верхние классы и интерфейсы. Библиотека B требует библиотеки A.

Это псевдокод некоторого кода, используемого в библиотеке B:

TheInterface instance = new TheClass();
instance.someMethod();

По-видимому, библиотека A более новая, чем библиотека B, а TheInterface больше не содержит someMethod, но TheClass все еще работает. Единственный способ исправить это - получить источник для jar и изменить эти вещи вручную (если это вообще возможно).