2013-08-31 28 views
16
class A { 

    public static void main(String...args) { 
     Integer var = 10; 

     if(var instanceof Character) // Line1 
      System.out.println("var is a Character"); 
    } 
} 

so Linea 1 non verrà compilato perché il compilatore ha scoperto che var non è un Character.instanceof in Java - perché questo non viene compilato?

Quello che non riesco a capire è perché il compilatore genera un errore invece di restituire false o true.

Se il compilatore restituisce false o true (cioè trattare l'operazione instanceof come un normale convalida sulla base se-), allora molto più utile .. non è vero?

O mi manca qualcosa di ovvio?

+3

Modifica 'Numero intero var = 10;' a 'Oggetto var = 10;'. Il compilatore ti sta dicendo che 'var' può ** mai ** essere' instanceof Character' se lo dichiari come 'Integer'. –

+5

Perché è down down? È una domanda abbastanza legittima. –

+0

@RohitJain I miei pensieri esattamente. –

risposta

18

È un errore di compilazione secondo JLS §15.20.2:

Se un calco della RelationalExpression al ReferenceType verrebbe rifiutato come errore di compilazione, allora l'espressione relazionale instanceof produce altresì un errore in fase di compilazione. In una situazione del genere, il risultato dell'espressione instanceof non può mai essere vero.

RelationalExpression è il primo operando instanceof e ReferenceType è il secondo.

3

Oltre alla risposta del arshajii se si vuole evitare l'errore in fase di compilazione e volete run-time vero falso risultato/per verificare se var è istanza di carattere quindi utilizzare il codice come questo:

if(var.getClass().isAssignableFrom(Character.class)) 
    System.out.println("var is a Character"); 
else 
    System.out.println("var is NOT a Character"); 

Come previsto, verrà stampato:

var is NOT a Character 
+3

Penso che il punto fondamentale del JLS sia che questo controllo può ** mai ** restituire 'true' se si sa che il tipo non è assegnabile. Questo è del tutto inutile - se sai che è un 'Integer', allora questo controllo è ridondante, 'return false' funzionerebbe altrettanto bene. Se non sai che il 'var' è un' Integer', cioè hai un 'Object', quindi' instanceof' si compilerà bene. –

+1

è utile, se voglio fare meno codice in alcuni casi.Ho un progetto crosswalk in modalità condivisa in fase di sviluppo e una modalità incorporata per la produzione, uso 'if (questa istanza di XWalkActivity)' per controllare, ma compila un errore. 'Https: // crosswalk-project.org/documentazione/shared_mode.html' –

Problemi correlati