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?

È stato utile?

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'espressione instanceof 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 implementa Cloneable
  • 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".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top