variable español error cannot java guice

español - Error de Java: interfaz encontrada... pero se esperaba una clase



javac error cannot find symbol (4)

Esto sucede cuando su classpath de tiempo de ejecución es diferente de su classpath de tiempo de compilación.

Cuando su aplicación fue compilada, una clase (llamada SomeInterface en su pregunta) existía como una clase.

Cuando su aplicación se ejecuta en tiempo de compilación, SomeInterface existe como una interfaz (en lugar de una clase).

Esto hace que se lance IncompatibleClassChangeError en tiempo de ejecución.

Esta es una ocurrencia común si tenía una versión diferente de un archivo jar en el classpath del tiempo de compilación que en el classpath del tiempo de ejecución.

Recibo un extraño error de tiempo de ejecución de mi código:

"Found interface [SomeInterface] but class was expected"

¿Cómo puede pasar esto? ¿Cómo se puede crear una instancia de una interfaz?

Actualización: (En respuesta a algunas respuestas) Estoy compilando y ejecutándome contra el mismo conjunto de bibliotecas, pero estoy usando Guice para inyectar un Proveedor para esta Interfaz en particular.

El problema desapareció cuando até una implementación a la interfaz (parece que la anotación @ImplementedBy no fue suficiente).

Estaba más interesado en la mecánica a través de la cual Guice logró instanciar una interfaz.


Lo más probable es que el código se compiló contra una clase en una biblioteca, que luego se cambió a una interfaz en la versión con la que se ejecuta.


Parece que lo hiciste

class MyClass extends SomeInterface

cuando en realidad debería ser

class MyClass implements SomeInterface

¿Estoy en lo cierto?

EDIT: ¿Oh, dices que es un error de tiempo de ejecución y no un error en tiempo de compilación ? Déjame mirar un poco alrededor ...

EDIT 2: Parece que Jared tiene la respuesta correcta. De todos modos, intentar extender una interfaz en realidad daría un mensaje de " no se espera una interfaz aquí " en el momento de la compilación, no un error de "se encontró una interfaz pero se esperaba una clase ".


Yo tuve el mismo problema. Yo uso dos bibliotecas jar en mi aplicación. Una biblioteca está construida sobre la otra.

La biblioteca A define las mejores clases e interfaces. La Biblioteca B requiere la biblioteca A.

Este es un pseudocódigo de algún código usado en la biblioteca B:

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

Aparentemente, la biblioteca A es más nueva que la biblioteca B y TheInterface ya no contiene someMethod , pero TheClass aún lo hace. La única forma de solucionar esto es obtener la fuente de cualquiera de los archivos jar y cambiar estas cosas a mano (si es posible).