2011-09-12 14 views
26

Sono incappato in uno strano comportamento che non capisco.Aggiungi @SuppressWarnings ("deselezionato") in generici a riga singola genera l'errore del compilatore di eclissi

Devo trasmettere una stringa a un generico e sta producendo un avviso.

Type safety : Unchecked cast from String to T 
  • Se aggiungo @SuppressWarnings("unchecked") al di sopra della dichiarazione del metodo funziona benissimo.

  • Se aggiungo sopra l'assegnazione, genera un errore del compilatore in eclissi.

Questo funziona correttamente.

@SuppressWarnings("unchecked") 
public <T> T search(final String query){ 
T returnValue = null; 
... 
if(returnValue instanceof String){ 
    returnValue = (T) collection.getString(attrName); 
} 

Questo non funziona correttamente.

Qualche idea di cosa sta causando la discrepanza tra i due metodi di soppressione dell'avviso?

risposta

41

Non è possibile avere annotazioni su espressioni arbitrarie (ancora? Forse lo aggiungeranno in seguito).

È possibile tuttavia avere annotazioni su dichiarazioni di variabili locali.

Così che cosa il compilatore cerca di fare qui è di interpretare returnValue come un tipo (come quella è l'unica cosa che può seguire un'annotazione all'interno di un corpo del metodo) e non riesce.

L'annotazione nella dichiarazione di returnValue non è di aiuto in questo caso. È comunque possibile creare una nuova variabile locale in cui eseguire il cast nell'inizializzatore e annotarlo.

@SuppressWarnings("unchecked") 
T string = (T) collection.getString(attrName); 
returnValue = string; 
+0

venuti qui, perché non ho capito l'errore _ "Errore di sintassi sui risultati 'token, VariableDeclaratorId previsto dopo questo token" _ in Eclipse. La tua spiegazione su cosa prova il compilatore e perché fallisce è grandiosa! Semplicemente aggiungendo questo commento, nel caso in cui qualcun altro cerchi questo errore di sintassi. – user1438038

Problemi correlati