Java 6: @SuppressWarnings non supportate ( “rawtypes”) di avvertimento
-
01-10-2019 - |
Domanda
mi sono trasferito in una nuova macchina, che ha l'ultimo compilatore Java di Sun e notò alcune avvertenze nel codice esistente Java 6. L'IDE Eclipse, mi suggerì di annotare l'assegnazione di:
@SuppressWarnings("rawtypes")
Ad esempio:
class Foo<T> {
...
}
...
@SuppressWarnings("rawtypes")
Foo foo = new Foo();
Quando mi sono trasferito di nuovo alla macchina con il compilatore più anziani (JDK 1.6.0_20), ho notato che questo compilatore più vecchio mette in guardia circa la soppressione della "rawtypes" avvertimenti, sostenendo che questa soppressione non è supportato e proponendo di sostituirlo con @SuppressWarnings ( "incontrollato"). Inoltre, ci sono stati alcuni luoghi che il nuovo compilatore, per impostazione predefinita, mi ha fatto a mettere entrambi "non controllate" e "rawtypes" - compilare il codice con il compilatore più vecchio riproduce lo stesso avvertimento
.Come posso far rispettare all'indietro compatibilità / avanti tra i due, in modo che né il compilatore produce avvertimenti?
Soluzione
È possibile utilizzare la @SuppressWarnings("unchecked")
che è supportato sia dal compilatore Eclipse e javac.
Ma ricordate l'annotazione @SuppressWarnings
viene utilizzato dal compilatore che può avere i propri valori. I JLS costringe solo il compilatore di capire i valori "incontrollato" e "deprecato" (per ora).
fornitori compilatore dovrebbe documentare i nomi di avvertimento che supportano in combinazione con questo tipo di annotazione. Si sono incoraggiati a cooperare per garantire che gli stessi nomi lavorano su più compilatori .
Se si utilizza Helios, è necessario impostare una specifica opzione per consentire @SuppressWarnings("unchecked")
invece di @SuppressWarnings("rawtypes")
,
Nel caso non sia possibile aggiornare il codice con il nuovo token, la proprietà di sistema
suppressRawWhenUnchecked=true
può essere impostata all'avvio Eclipse.
Risorse:
- JLS - @SuppressWarnings ()
- Eclipse JDT ( Java Compiler , Nuovo "rawtypes" gettone per @SuppressWarnings annotazione )
EDIT: Ecco l'articolo knol ora disponibile che è stato utilizzato come riferimento, originariamente scritto da Alex Miller .
@SuppressWarnings annotazione in Java
annotazione standard per la soppressione dei vari avvisi
L'annotazione SuppressWarnings è stata aggiunta come annotazione standard Java SE 5.
Definizione
Il @ SuppressWarnings annotazione viene definito nel linguaggio Java Specification sezione 9.6.1.5 . Questa sezione afferma:
Il tipo di annotazione controllo supporta
SuppressWarnings
programmatore oltre avvertimenti altrimenti emessi dal compilatore Java. Esso contiene un singolo elemento che è un array diString
. Se una dichiarazione programma viene annotato con la@SuppressWarnings(value = {S1, ... , Sk})
annotazione, poi un compilatore Java non deve riportare alcun preavviso identificato da uno dei S1, ..., Sk se questo avvertimento sarebbe stato generato a seguito della dichiarazione annotata o una delle sue parti .avvertimenti non selezionati sono identificati dalla stringa "
unchecked
".su
@Deprecation
menziona anche che questi avvertimenti possono essere soppressi con@SuppressWarnings("deprecation")
.Tipi di avvertimento validi
Gli unici due stringhe di avviso che sono menzionati nella specifica per sé sono "incontrollato" e "disapprovazione". Tuttavia, il Sun JDK utilizza un insieme più ampio di stringhe nel compilatore. È possibile determinare la corrente impostata eseguendo:
javac -X
che vi mostrerà (tra le altre cose) le impostazioni valide per -Xlint.
Ad esempio, Sun JDK 1.5 spettacoli:
- tutti - sopprimere tutti gli avvertimenti di questo codice
- deprecazione - avvertimenti Sopprimere da utilizzando il codice deprecato
- incontrollato - avvertimenti Sopprimere da una chiamata senza controllo o di un cast incontrollato
- falltrough - avvertimenti Ometti se un interruttore cade attraverso senza trovare un caso valido (e nessun valore predefinito)
- percorso -
- di serie - le avvertenze Ometti se una classe Serializable non definisce un serialVersionUID
- , infine, - avvertimenti Sopprimere da restituire entro un fine (che Ignoritorno nuovamente con la prova)
E Sun JDK 1.6 aggiunge:
- Cast
- divzero - allerta sopprime se viene rilevato integer divisione per zero
- vuoto
- override
- none
IDEs e strumenti di analisi statica tipicamente supportano un gran numero di altri valori possibili per @SuppressWarnings. Questi valori corrispondono a controlli di analisi specifica statici eseguiti dal IDE.
Eclipse
I valori di allarme Eclipse per Eclipse 3.3 sono documentato nella documentazione JDT .
- tutti - eliminare tutte le avvertenze
- boxing - avvertimenti Sopprimere relativo alla boxe / operazioni di unboxing
- Cast - le avvertenze Sopprimere relative ad operazioni del cast
- dep-ann - avvertimenti Sopprimere rispetto al deprecato annotazione
- deprecazione - avvertimenti Sopprimere relativo alla deprecazione
- falltrough - avvertimenti Sopprimere relativi alle interruzioni di istruzioni switch mancante
- , infine, - avvertimenti Sopprimere relativi al blocco, infine, che non restituiscono
- nascondiglio - avvertimenti Sopprimere relativi alla gente del posto che nascondere variabile
- incompleta-switch - avvertimenti Sopprimere relativi a voci mancanti in un'istruzione switch (caso enum)
- NLS - avvertimenti Sopprimere rispetto ai non-nls stringhe letterali
- null - avvertimenti Sopprimere relativa all'analisi nullo
- restrizione - avvertimenti Sopprimere relativi all'utilizzo dei scoraggiato o riferimenti proibiti
- di serie - le avvertenze Sopprimere relative al campo serialVersionUID mancante per una classe serializzabile
- statico-accesso - le avvertenze relative al Sopprimere l'accesso statico errato
- sintetico accesso - allerta sopprime relativa all'accesso non ottimizzata da classi interne
- incontrollato - avvertimenti Sopprimere relativi ad operazioni non controllate
- non qualificato campo di accesso - le avvertenze relative al Sopprimere l'accesso incondizionato campo
- non utilizzato - avvertimenti Sopprimere rispetto al codice non utilizzato
IntelliJ
NetBeans
Esempi
Un esempio di specificare un unico ammonimento:
@SuppressWarnings("unchecked") public void methodWithScaryWarnings() { List rawList = new ArrayList(); List<String> stringList = (List<String>)rawList; }
Un esempio di utilizzo di due avvertimenti:
@SuppressWarnings({"unchecked","deprecation"}) public void methodWithScaryWarnings() { callDeprecatedMethod(); }
Altri suggerimenti
Si noti che Eclipse 3.5 non capisce rawtypes e bandiere un avvertimento per passare alla incontrollato. E 'frustrante che Eclipse si avvicinò con rawtypes annotazione che causa più problemi che solving. Dovrebbero hanno appena bloccato con quella standard.