Ho un valore parametrizzato, che si risolve in fase di esecuzione:Come evitare il cast non controllato quando la variabile generica viene risolta in fase di runtime?
public class GenericsMain {
public static void main(String... args) {
final String tag = "INT";
Field field = resolve(tag);
if (tag.equals("INT")) {
/*
In here I am using the "secret knowledge" that if tag equals INT, then
field could be casted to Field<Integer>. But at the same time I see an unchecked cast
warning at here.
Is there a way to refactor the code to be warning-free?
*/
Field<Integer> integerField = (Field<Integer>) field;
foo(integerField);
}
}
public static Field resolve(String tag) {
switch (tag) {
case "INT":
return new Field<>(1);
case "DOUBLE":
return new Field<>(1.0d);
default:
return null;
}
}
public static <T> void foo(Field<T> param) {
System.out.println(param.value);
}
static class Field<T> {
public final T value;
public Field(T value) {
this.value = value;
}
}
}
C'è un modo per evitare fusione incontrollata nel codice qui sopra (contrassegnati con un lungo commento)?
Non direttamente. (Java non supporta i tipi di flusso.) È comunque possibile utilizzare un modello di visitatore. – aioobe
Dai un'occhiata a questa domanda: http://stackoverflow.com/questions/1129795/what-is-suppresswarnings-unchecked-in-java – stevecross
@aioobe Sarei davvero carino se lo elabori con un esempio. –