instanceof - unvereinbar bedingter Operand-Typ
-
23-09-2019 - |
Frage
Das folgende compiles fein:
Object o = new Object();
System.out.println(o instanceof Cloneable);
Aber das bedeutet nicht:
String s = new String();
System.out.println(s instanceof Cloneable);
Ein Compiler-Fehler ausgelöst wird.
Was ist das Problem?
Lösung
Eine eklatante Inkarnation des Problems ist die folgende:
if ("foo" instanceof Number)
// "Incompatible conditional operand types String and Number"
Dies wird angegeben in JLS 15.20.2 Typ Vergleichsoperator instanceof
:
RelationalExpression: RelationalExpression instanceof ReferenceType
Wenn ein Abguss des RelationalExpression die Reference würde als Fehler bei der Kompilierung zurückgewiesen wird, dann ist der
instanceof
relationale Ausdruck erzeugt ebenfalls einen Fehler bei der Kompilierung. In einer solchen Situation könnte das Ergebnis derinstanceof
Ausdruck nie wahr sein.
Das heißt, da dieser gegossene Ausdruck eine Kompilierung Fehler erzeugt:
(Number) "foo"
so muss dieser Ausdruck:
("foo" instanceof Number)
Ihr Fall ist ein bisschen subtile, aber das Prinzip ist das gleiche:
-
String
ist eine endgültige Klasse -
String
nicht implementiertCloneable
- Sie können also nicht
(Cloneable) aString
- Daher können Sie auch nicht tun
aString instanceof Cloneable
Andere Tipps
Ein verwandtes Problem, dass ich gekommen bin, über vor kurzem (und die mich dazu gebracht, auf dieser Seite, bevor ich herausgefunden, was los war) ist, dass die Eclipse-Umgebung „Inkompatible bedingten Operand-Typ“ in einem ‚instanceof‘ Ausdruck berichtet fälschlicherweise aufgrund einer auf der rechten Seite des ‚instanceof‘ für den Typ ‚importieren‘ Anweisung fehlt. Ich verbrachte eine Weile, um herauszufinden, wie die Typen in Frage möglicherweise nicht kompatibel sein könnten, bevor herauszufinden, dass ein fehlender Import das ganze Problem verursacht wurde. Hoffentlich wird diese Informationen speichert jemand etwas Zeit.
Der Compiler weiß, dass String
eine letzte Klasse ist und nicht implementiert Cloneable
. Also keine Instanz von String kann immer eine Instanz von Cloneable
sein. Es wird Sie vom Denken hindert Sie einen aussagekräftigen Test haben, wenn es tatsächlich immer „false“ gedruckt wird.