instanceof - tipi di operando condizionali incompatibili
-
23-09-2019 - |
Domanda
Di seguito compila bene:
Object o = new Object();
System.out.println(o instanceof Cloneable);
Ma questo non lo fa:
String s = new String();
System.out.println(s instanceof Cloneable);
Un errore di compilazione è gettato.
Qual è il problema?
Soluzione
Un'incarnazione più evidente del problema è il seguente:
if ("foo" instanceof Number)
// "Incompatible conditional operand types String and Number"
Questo è specificato in JLS 15.20.2 tipo operatore di confronto instanceof
:
RelationalExpression: RelationalExpression instanceof ReferenceType
Se un calco del RelationalExpression al ReferenceType verrebbe respinta come errore di compilazione, allora l'espressione relazionale
instanceof
produce anche un errore di compilazione. In una tale situazione, il risultato dell'espressioneinstanceof
non potrebbe mai essere vera.
Cioè, dal momento che questa espressione getto genera un errore di compilazione:
(Number) "foo"
così bisogna che questa espressione:
("foo" instanceof Number)
Il tuo caso è un po 'più sottile, ma il principio è lo stesso:
-
String
è una classe finale -
String
non implementaCloneable
- Quindi non si può fare
(Cloneable) aString
- Quindi anche non si può fare
aString instanceof Cloneable
Altri suggerimenti
Un problema correlato che ho incontrato di recente (e che mi ha portato a questa pagina, prima di capire quello che stava succedendo) è che l'ambiente Eclipse può segnalare "incompatibili tipi di operando condizionali" in un 'instanceof' espressione erroneamente a causa di una dichiarazione 'importazione' mancante per il tipo a destra del 'instanceof'. Ho passato un po 'cercando di capire come i tipi in questione potrebbe essere incompatibile prima di capire che un'importazione mancante stava causando l'intero problema. Speriamo che queste informazioni consente di risparmiare qualcuno un po 'di tempo.
Il compilatore sa che String
è una classe finale e non implementa Cloneable
. Quindi nessuna istanza di stringa può mai essere un'istanza di Cloneable
. E ti impedisce di pensare che hai un test significativo quando in realtà sarà sempre la stampa "false".