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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top