12

Ok, quindi sto chiamando un metodo con una firma (Class<? extends Throwable>... exceptions) e ho ottenere un "File.java utilizza operazioni non controllate o non sicure" warning qui nel metodo principale:Perché l'operazione varargs (Classe <? Extends Throwable> ... t) "non selezionata o non sicura"?

public class VarargsFun { 
    public void onException(Class<? extends Throwable>... exceptions) { } 

    public static void main(String[] args) { 
     new VarargsFun().onException(IllegalArgumentException.class); 
    } 
} 

Non dovrebbe il compilatore in grado di vedere che IllegalArgumentException estende effettivamente RuntimeException, Exception e Throwable?

Come devo modificare correttamente il mio codice per eliminare questo avviso?

Non mi sento come istanziare le mie eccezioni ... sembra più bello di utilizzare la .class

(non voglio usare @SuppressWarnings sia!)

sto usando Java 7. Grazie per eventuali suggerimenti .

+0

Sei sicuro che l'avviso provenga da "thenThrow" e non "when'? Come viene dichiarato 'mockQuery'? È una simulazione di una classe generica? –

+0

Ok ho cambiato il codice in un esempio testabile. – vikingsteve

risposta

11

Poiché i vararg sono in realtà solo array e generics and arrays don't mix (beh), Java ha tradizionalmente indicato un avviso quando si chiama un metodo con un tipo generico vararg. Questo perché l'array viene tecnicamente creato al chiamante.

Tuttavia, ben presto divenne evidente che gli array creati esclusivamente per essere passato a un metodo varargs non soffrono dello stesso pericolo, come normali array generici dal punto di vista della del chiamante, ma il metodo stesso che ha ricevuto la matrice generica potrebbe abusare loro. Così in Java 7 in avanti, viene visualizzato l'avviso sul metodo stesso (nel tuo caso, onException) e può essere soppresso utilizzando il @SafeVarargs annotazioni sul metodo:

@SafeVarargs 
public void onException(Class<? extends Throwable>... exceptions) { } 

Se non si è in realtà utilizzando la Java 7 lingua, o se non è possibile modificare onException (presumibilmente perché si tratta di un metodo di biblioteca), allora si può tranquillamente utilizzare @SuppressWarnings per nascondere che l'avvertimento:

@SuppressWarnings("unchecked") 
public static void main(String[] args) { 
    new VarargsFun().onException(IllegalArgumentException.class); 
} 

Se si elimina avvertimenti in questo modo però, fare attenzione ad isolare questa affermazione con il proprio metodo in modo da non sopprimere accidentalmente ot i suoi futuri avvertimenti.

Personalmente, disabilito completamente avvisi generici di vararg nel mio IDE, perché non indicano quasi mai codice errato dal punto di vista del chiamante.

+0

Leggi di nuovo la tua risposta incluso l'ultimo paragrafo. Grazie! – vikingsteve

+0

È strano anche che non ricevo gli avvisi sonar da questo. In ogni caso, ho aggiunto '@SuppressWarnings (" unchecked ")' sul metodo. Di nuovo. – vikingsteve

11

E 'più facile da capire se vi rendete conto che

new VarargsFun().onException(IllegalArgumentException.class); 

è lo zucchero sintattico per

new VarargsFun().onException(
    new Class<? extends Throwable>[]{ IllegalArgumentException.class }); 

vale a dire il sito crea di un array con il tipo di elemento pari al tipo dei varargs.

Ma ovviamente, new Class<? extends Throwable>[] non è consentito in Java. Quindi il compilatore fa new Class<?>[] e dà un avvertimento.

+0

Grazie newacct! Ho già accettato la risposta di Mark, ma grazie anche per aver aggiunto il tuo. – vikingsteve

Problemi correlati