Ich habe versucht zu sehen, wie instanceof-Operator in Java funktioniert, und ich stehe vor einem sehr seltsamen Problem.
%Vor%Das obige Ergebnis gibt false wie erwartet zurück. Jedoch,
%Vor%Dies wird nicht einmal kompiliert. Ich erhalte einen Fehler
%Vor%Was fehlt mir hier? Ich verwende IntelliJ Idea 11.
Aus der Java-Sprachspezifikation 3.0, Abschnitt 15.20.2:
Wenn eine Umwandlung von RelationalExpression in den ReferenceType erfolgt als Kompilierungsfehler zurückgewiesen, dann die instanceof relational Ausdruck erzeugt ebenfalls einen Kompilierzeitfehler. In einem solchen Situation, das Ergebnis des Ausdrucksausdrucks könnte niemals sein wahr.
Da Sie eine Umwandlung von HashMap
in Date
nicht kompilieren können, können Sie auch keinen instanceof
test zwischen beiden kompilieren.
Sie deklarieren ein Map m
und verwenden instanceof
, weil Map
ein interface
ist, was eine neue Klasse ist, kann extends Date implements Map
. Andere (nicht Date) abstrakte Klassen oder Klassen verursachen einen Kompilierungsfehler.
@Bon Espresso hat meiner Meinung nach fast die richtige Antwort gegeben. Und hier ist meine kleine Ergänzung:
Sie müssen verstehen, was instanceof wirklich tut, also die Definition:
instanceof ist ein binärer Operator, der überprüft, ob eine Instanz einen bestimmten Typ aufweist
Also, wenn Sie das tun:
%Vor%Zur Kompilierungszeit ist m eigentlich eine Schnittstelle , aber der eigentliche Test gegen instanceof findet zur Laufzeit statt mit einer Instanz NOT eine Schnittstelle , daher kann der Compiler nicht sicher sein Wenn die Instanz "hinter" m (eine Klasse, die diese Schnittstelle implementiert) tatsächlich eine Klasse ist, die Date erweitern könnte.
Ich meine, du könntest eine Klasse mit einer Erklärung wie dieser haben:
%Vor%Und Sie könnten das dann tun:
%Vor%und es wäre vollkommen legal, weil MyClass das Datum tatsächlich verlängert.
Die Idee hier, wie Sie sehen können, dass, wenn es die geringste Chance gibt, dass die Prüfung mit instanceof erfolgreich sein wird, der Compiler nicht klagen wird.
Auf der anderen Seite in Ihrem zweiten Beispiel:
%Vor%Sie deklarieren eine tatsächliche Implementierung der Map-Schnittstelle oder eine -Instanz . In diesem Fall ist der Compiler sicher, dass HashMap das Datum nicht verlängert, und gibt Ihnen den Fehler.
Bitte beachten Sie die JLS-Spezifikation, die hier erwähnt wird Ссылка .
Dies wurde hier sehr gut beantwortet instanceof - inkompatible bedingte Operandentypen
Tags und Links java instanceof