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?

È stato utile?

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:


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 di String. 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.

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