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).