instanceof-Operator in Java zum Vergleichen verschiedener Klassen

8

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.

    
Ankit Dhingra 02.02.2012, 06:09
quelle

4 Antworten

9

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.

    
Adam Mihalcin 02.02.2012, 06:15
quelle
4

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.

%Vor%     
Bon Espresso 02.02.2012 06:16
quelle
2

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

    
Eugene 02.02.2012 07:09
quelle
0

Bitte beachten Sie die JLS-Spezifikation, die hier erwähnt wird Ссылка .

Dies wurde hier sehr gut beantwortet instanceof - inkompatible bedingte Operandentypen

    
Scorpion 02.02.2012 06:18
quelle

Tags und Links