Ошибка Java: найден интерфейс... но класс ожидался
Я получаю странную ошибку времени выполнения из моего кода:
"Found interface [SomeInterface] but class was expected"
Как это может произойти? Как можно получить экземпляр интерфейса?
Обновление: (в ответ на некоторые ответы) Я компилирую и запускаю тот же набор библиотек, но я am, используя Guice, чтобы ввести поставщика для этого конкретного Интерфейса.
Проблема исчезла, когда я привязал реализацию к интерфейсу (похоже, аннотация @ImplementedBy была недостаточной).
Меня больше интересовала механика, благодаря которой Guice удалось фактически создать интерфейс.
Ответы
Ответ 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 и изменить эти вещи вручную (если это вообще возможно).