2012-10-14 11 views
6

Ho fatto un sacco di ricerca di ciò che questo errore del compilatore <identifier> expected significa, e nessuno di loro sembra applicarsi alla mia situazione. Mi dispiace davvero se si tratta di informazioni duplicate o di base, ma non riesco a trovare nulla da nessuna parte.Errore del compilatore Java non ha alcun senso (<identifier> previsto)

Il seguente codice funziona correttamente. Si noti che io sono positivo myObject1 è davvero un HashSet<String> quindi il cast è ok.

@SuppressWarnings("unchecked") 
HashSet<String> s1 = (HashSet<String>) myObject1; 

Il seguente codice NON funziona correttamente. Si compilerà, ma con avvertimenti.

@SuppressWarnings("unchecked") 
HashSet<String> s1; 
s1 = (HashSet<String>) myObject1; 

Quindi quindi provo il codice qui sotto.

@SuppressWarnings("unchecked") 
HashSet<String> s1; 
@SuppressWarnings("unchecked") 
s1 = (HashSet<String>) myObject1; 

Ora si rifiuta di compilare anche, dandomi l'errore <identifier> expected che mi sta tanto sconcertante. Il simbolo ^ nella mia riga di comando punta a destra prima dello = nell'ultima riga. Non sono sicuro di cosa ci si possa aspettare che metta TRA lo s1 e lo =.

Qualche idea? Grazie!

+0

Poiché il compilatore si aspetta una dichiarazione lì, 's1' viene analizzato come un nome di tipo, quindi naturalmente si aspetta che un'entità di tipo' s1' sia nominata in seguito. –

+1

Al di fuori dell'ambito della domanda, è necessario utilizzare "Imposta " anziché "HashSet ". Anche se conosci la classe di implementazione in fase di sviluppo, dovresti pensare alle interfacce. Cosa succede se qualcuno in seguito decide di spostare il codice in 'TreeSet', il team * deve * cambiare tutti questi file con' HashSet' e spostarlo in 'TreeSet'? –

+0

Grazie Luiggi, so che mi hai appena detto la stessa cosa in una domanda diversa e stavo ancora facendo lo stesso errore qui ... grazie per il promemoria. :-) – The111

risposta

11

Non è possibile applicare un'annotazione a un'istruzione di assegnazione semplice. Da section 9.7 of the JLS:

annotazioni possono essere utilizzate come modificanti in ciascuna dichiarazione, se il pacchetto (§7.4.1), classe (§8.1.1) (compresi enumerazioni (§8.9)), interfaccia (§9.1.1) (compresi i tipi di annotazione (§9.6)), campo (§8.3.1, §9.3), metodo (§8.4.3, §9.4), parametro formale (§8.4.1), costruttore (§8.8.3), o variabile locale (§14.4.1).

Sono d'accordo che il messaggio di errore del compilatore potrebbe essere piuttosto chiara, è vero ...

+0

Grazie Jon. Ho modificato leggermente il mio OP per riflettere quello che sto provando a fare davvero. Se voglio dichiarare 's1' su una riga ma assegnarlo in seguito ... c'è un modo per sopprimere l'avviso che ottengo all'assegnazione? Oltre a mettere un'annotazione per l'intero metodo, ovviamente, che sembra sciatta. – The111

+3

utilizza una variabile temporanea e assegna la variabile temporanea in seguito a s1, mentre la variabile temporanea ha il tipo corretto – daniel

Problemi correlati