Ho un codice generico che non riesco a capire come impedire in modo legittimo di ricevere gli avvisi; Sto usando @SuppressWarnings ("deselezionato") per il momento, dal momento che sembra che il casting di un tipo generico non possa essere fatto senza avvertimenti.Avvisi in Java quando si esegue il casting su un tipo generico
Come posso eliminare l'annotazione?
Quello che ho è:
public MyObject(SharedContext<Object> ctx) {
super(ctx); // set protected field 'context'
...
context.set("Input Fields" ,Collections.synchronizedMap(new TreeMap<String,Pair<String,Boolean>>(String.CASE_INSENSITIVE_ORDER)));
context.set("Output Fields" ,Collections.synchronizedMap(new TreeMap<String,String> (String.CASE_INSENSITIVE_ORDER)));
context.set("Event Registry",new EventRegistry(log) );
}
@SuppressWarnings("unchecked")
protected void startup() {
inputFields =(Map<String,Pair<String,Boolean>>)context.get("Input Fields" ,null);
outputFields =(Map<String,String> )context.get("Output Fields" ,null);
eventRegistry =(EventRegistry )context.get("Event Registry",null);
...
}
Il contesto variabile protetta è di tipo SharedContext<Object>
.
Senza l'annotazione il compilatore dà avvertimenti:
...\MyClass.java:94: warning: [unchecked] unchecked cast
found : java.lang.Object
required: java.util.Map<java.lang.String,com.mycompany.Pair<java.lang.String,java.lang.Boolean>>
inputFields =(Map<String,Pair<String,Boolean>>)context.get("Input Fields" ,null);
^
...\MyClass.java:95: warning: [unchecked] unchecked cast
found : java.lang.Object
required: java.util.Map<java.lang.String,java.lang.String>
outputFields =(Map<String,String> )context.get("Output Fields" ,null);
Personalmente, considererei "GenUtil.uncheckedCast" un male peggiore rispetto alla soppressione di un avvertimento specifico: non vi è alcuna garanzia che questo metodo di utilità sia utilizzato in modo responsabile, ovvero in un modo che non causi inquinamento da heap, ma i programmatori non vengono più richiesti da un avvertimento per tentare un'implementazione più robusta. (Che a volte, anche se non sempre, è possibile ...) – meriton
Non sono d'accordo - qualsiasi cast in sostanza informa il compilatore "So che tipo di questo è e non lo fai, quindi togliti di mezzo e prendi il mio parola per questo ". L'avvertimento emesso in questa circostanza non dovrebbe essere lì - è come se il compilatore dicesse "So che non lo so, ma non sono nemmeno convinto che tu lo faccia". –
Il compilatore non prende la parola, emette un controllo di runtime. Un cast può essere (e talvolta è) usato come asserzione sul tipo di un oggetto. L'avviso indica che questo controllo è incompleto e quindi non può essere invocato. – meriton