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?

War es hilfreich?

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 der instanceof 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 implementiert Cloneable
  • 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.

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