Tengo un código genérico que no puedo deducir cómo prevenir legítimamente las advertencias; Estoy usando @SuppressWarnings ("desmarcado") por el momento, ya que parece que lanzar un tipo genérico no se puede hacer sin advertencias.Advertencias en Java al convertir a un tipo genérico
¿Cómo puedo deshacerme de la anotación?
Lo que tengo es:
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);
...
}
El contexto variables protegida es de tipo SharedContext<Object>
.
Sin la anotación el compilador da advertencias:
...\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, consideraría 'GenUtil.uncheckedCast' un mal peor que suprimir una advertencia específica: no hay garantía de que este método de utilidad se use de manera responsable, es decir, de una manera que no cause contaminación acumulativa, pero los programadores ya no se muestran con una advertencia para intentar una implementación más robusta. (Que a veces, aunque no siempre, es posible ...) – meriton
No estoy de acuerdo - cualquier elenco es, en esencia, informar al compilador "Sé el tipo de esto y tú no, así que sal de mi camino y toma mi palabra para eso ". La advertencia emitida en esta circunstancia simplemente no debería estar allí, es como si el compilador dijera: "Sé que no sé, pero tampoco estoy convencido de que lo hagas". –
El compilador no toma su palabra, emite una verificación de tiempo de ejecución. Un yeso puede ser (y algunas veces es) usado como una afirmación sobre el tipo de un objeto. La advertencia le indica que esta verificación es incompleta y, por lo tanto, no se puede confiar en ella. – meriton