Java-Fehler: Gefunden Schnittstelle ... aber Klasse wurde erwartet,
Frage
Ich erhalte einen seltsamen Laufzeitfehler von meinem Code:
"Found interface [SomeInterface] but class was expected"
Wie kann das geschehen? Wie kann eine Schnittstelle instanziiert werden?
Update: (Als Reaktion auf einige Antworten) Ich bin die Zusammenstellung und gegen den gleichen Satz von Bibliotheken ausgeführt wird, aber ich am mit Guice ein Provider für diese spezielle Schnittstelle zu injizieren.
Das Problem ging weg, als ich eine Implementierung an die Schnittstelle gebunden (scheint, wie die @ImplementedBy Anmerkung war nicht genug).
war ich mehr daran interessiert, in der Mechanik, durch die verwalteten Guice, um tatsächlich eine Schnittstelle instanziiert.
Lösung
Dies geschieht, wenn Sie Ihre Laufzeit Classpath ist anders als Ihre Kompilierung Classpath.
Wenn Sie Ihre Anwendung kompiliert wurde, eine Klasse (mit dem Namen SomeInterface
in Ihrer Frage) existierte als eine Klasse.
Wenn Sie Ihre Anwendung ist bei der Kompilierung ausgeführt wird, existiert SomeInterface
als Schnittstelle (anstelle einer Klasse.)
Dies bewirkt, dass ein IncompatibleClassChangeError
zur Laufzeit geworfen werden.
Dies ist ein gemeinsames Auftreten, wenn Sie eine andere Version einer JAR-Datei auf der Kompilierung Classpath haben, als auf der Laufzeit Classpath.
Andere Tipps
Wahrscheinlich wurde der Code in einer Bibliothek gegen eine Klasse erstellt, die dann auf eine Schnittstelle in der Version, die Sie gegen laufen geändert wurden.
Ich hatte das gleiche Problem. Ich verwende zwei jar-Bibliotheken in meiner Anwendung. Eine Bibliothek ist auf der anderen gebaut.
Die Bibliothek A definiert obere Klassen und Schnittstellen. Bibliothek B erfordert Bibliothek A.
Dies ist Pseudo-Code ist der Code in der Bibliothek B verwendet:
TheInterface instance = new TheClass();
instance.someMethod();
Offenbar Bibliothek A ist neuer als Bibliothek B und TheInterface
enthält keine someMethod
mehr, aber TheClass
immer noch tut. Der einzige Weg, dies zu beheben, ist die Quelle für die beiden Gläser zu bekommen und diese Dinge von Hand ändern (wenn möglich).
Es klingt wie Sie haben
class MyClass extends SomeInterface
, wenn es eigentlich sein sollte
class MyClass implements SomeInterface
Habe ich Recht?
EDIT: Oh, Sie sagen, es ist ein Laufzeit Fehler und kein Compiler- Fehler? schauen Sie sich um Lassen Sie mich ein wenig ...
EDIT 2: Es sieht aus wie Jared die richtige Antwort hat. Wie auch immer, versucht, eine Schnittstelle tatsächlich eine geben würde, verlängern „ keine Schnittstelle erwartet hier “ Nachricht bei der Kompilierung, nicht ein „ gefunden Schnittstelle aber Klasse wurde erwartet, “ Fehler.
Das ist mir passiert, als ich ein maven build
ausgeführt wird.
Von dem, was ich sammeln konnte (wie auch von Jareds Antwort ) als der Grund war, dass - es zwei Versionen waren aus dem gleichen Glas 3rd-Party in meinem effektiven pom.xml
angegeben. Eine Version kam in als transitiven Abhängigkeit und die andere von mir in meinem lokalen pom.xml
angegeben wurden.
bei der Kompilierung Also, es wurde auf die alte Version beziehen und zur Laufzeit wurde mit Bezug auf die neue Version.
Ich entfernte die Version in meinem lokalen pom.xml
angegeben und es hat funktioniert.
Natürlich war die dritte Partei gebrochen Abwärtskompatibilität zwischen den Versionen und geändert, um eine Klasse zu einer Schnittstelle oder umgekehrt. Aber sie sind frei, dies zu tun.