2012-06-25 9 views
16

Utilizziamo alcune funzioni varargs e mentre ci spostiamo su java 1.7 viene visualizzato uno strano avviso non controllato.Funzione varargs Java 1.7 segnalata come avviso non controllato

funzione Add interfaccia Icache

public interface ICache<O> { 
    void add(Object source, O... objects); 
} 

in un'interfaccia segnala l'errore.

ICache.java:18: warning: [unchecked] Possible heap pollution from parameterized vararg type O 
    void add(Object source, O... objects); 
    where O is a type-variable: 
    O extends Object declared in interface ICache 
1 warning 

O estende Object, come classe di cache generica.

Ho letto gli avvisi xlint e lo compiliamo con deselezionato, ma http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#xlintwarnings sembra implicare che questo errore dovrebbe essere un tipo [varargs] non un tipo non controllato.

mi sto perdendo qualcosa?

+0

Possiamo vedere tutte le parti rilevanti di ICache e SomeClass? –

+0

Modificato per aggiungere la fonte. –

+1

Dai un'occhiata a [questo sito ufficiale di Oracle] (http://docs.oracle.com/javase/7/docs/technotes/guides/language/non-reifiable-varargs.html), spiega l'inquinamento da cumuli di heap in dettaglio , perché il compilatore Java 7 genera un avviso e come puoi sopprimerlo. – buc

risposta

2

Heap pollution è un termine che fa riferimento a un tipo che punta a un oggetto che non è il supertipo di quando si utilizzano vararg con un tipo generico. Si verifica quando una variabile di un tipo parametrico fa riferimento a un oggetto che non è di quel tipo parametrizzato. This overflow dello stack spiega esattamente cosa significa e cosa devi fare al riguardo e fornisce dettagli sull'annotazione @SafeVarargs. Quindi nell'interfaccia ICache, il tipo vararg O punta a Object nell'interfaccia, ma O non è il supertipo di Object e questo genera un avviso di inquinamento heap. Si noti come si dice possibile inquinamento heap. Se il tuo codice non causa problemi come quello che porta a ClassCastException, probabilmente sarà sicuro e non inquinerà l'heap, ma il compilatore non ha modo di provarlo e non può verificare la correttezza dell'operazione, quindi continuerà a generare il avvertimento. Questa è in realtà la definizione di un avviso non controllato: quando non è possibile verificare la correttezza di un'operazione che coinvolge un tipo parametrizzato. Vedere la pagina Oracle this su tipi non soggetti a revisione per ulteriori informazioni. Se non si desidera ottenere questo avviso, è possibile prevenirlo con SafeVarargs o semplicemente sopprimerlo aggiungendo @SuppressWarnings ({"unchecked", "varargs"}) alla dichiarazione del metodo, ma non si otterrà l'avviso nel caso in cui il metodo non sia effettivamente sicuro.

Problemi correlati