12 Stimmen

instanceof inkonsistente Ergebnisse bei der Erkennung von Schnittstellen liefert?

Gibt es irgendetwas Kniffliges, das ich wissen sollte über instanceof ? Ich übergebe eine Liste von Objekten durch einige Methoden und teste, ob diese Objekte eine bestimmte Schnittstelle implementieren, indem ich instanceof . In einigen Fällen, instanceof Objekte korrekt als Implementierung der Schnittstelle identifiziert, in anderen Fällen jedoch nicht. Es scheint mir widersprüchliche Ergebnisse für dasselbe Objekt an verschiedenen Stellen zu liefern. Gibt es einen Trick/Gotcha, den ich hier beachten sollte?

In Erwartung von Kommentaren, die Sie vielleicht haben:

1) Ich weiß instanceof ist schlechtes Benehmen. Ich arbeite mit einer nicht ganz perfekten Objekthierarchie, die nicht geändert werden kann, und das ist die am wenigsten schlechte Sache, die ich mir vorstellen kann.

2) Ich arbeite daran, ein Codebeispiel zu erstellen, aber ich muss meinen Code stark vereinfachen, wenn ich hier etwas Nützliches einfügen will. In der Zwischenzeit, wenn Sie dies gesehen haben, bevor und kann etwas Licht, bitte tun.

14voto

Jon Skeet Punkte 1325502

Laden Sie irgendwelche Typen dynamisch, möglicherweise von verschiedenen Classloadern? Das einzige Mal, dass ich scheinbar inkonsistente Ergebnisse gesehen habe, war, als ich zwei Codezeilen hatte, die siehe als würden sie sich auf denselben Typ beziehen, die diesen Typ aber tatsächlich von verschiedenen Classloadern geladen haben.

9voto

Tom Hawtin - tackline Punkte 142461

instanceof gibt immer zurück false para null . Es wird nicht kompiliert, wenn es unmöglich wäre, dass der statische Typ auf der linken Seite keine Instanz des angegebenen Typs sein kann. Ansonsten sollte es ohne Überraschungen funktionieren.

Im Gegensatz zu C++ (und ich glaube Smalltalk) kann ein Objekt seinen Typ zur Laufzeit nicht ändern. In C++ ändert sich der Typ während der Konstruktion, so dass Methoden nicht von einem Konstruktor zu Methoden einer abgeleiteten Klasse [Unterklasse] aufgerufen werden können.

9voto

morgancodes Punkte 24573

Ok, Problem gelöst. Wie üblich war das Problem weniger seltsam, als ich dachte. Das Projekt, an dem ich arbeite, ist in der unglücklichen Lage, einige doppelte Klassennamen zu haben. Ich habe die Klasse mit foo.MyInterface erstellt und auf eine Instanz von bar.MyInterface getestet. Vielen Dank für die Antworten. Sie haben mir wirklich geholfen, das Ganze zu durchdenken.

5voto

cadrian Punkte 7202

Das einzige Problem, von dem ich weiß, ist, dass null es instanceof kein Typ.

3voto

siddhadev Punkte 16181

Solange Sie kein Problem mit dem Laden von Klassen haben, funktioniert instanceof immer. Ich nehme an, Sie wissen, dass A instanceof B true zurückgibt, wenn A von B geerbt wird oder einige der Schnittstellen, die A implementiert oder Klassen, die A erweitert, instanceof B sind.

Wenn Sie false erhalten, wenn Sie true erwarten, versuchen Sie wahrscheinlich, Instanzen zu vergleichen, die von verschiedenen ClassLoadern kommen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X