Ich habe einen parametrisierte Wert, dh zur Laufzeit aufgelöst:Wie vermeiden Sie eine ungeprüfte Umwandlung, wenn die generische Variable zur Laufzeit aufgelöst wird?
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;
}
}
}
Gibt es eine Möglichkeit ungeprüft Guss in dem obigen Code zu vermeiden (mit einem langen Kommentar markiert)?
Nicht direkt. (Java unterstützt keine Flow-Typen.) Sie könnten hier jedoch ein Besuchermuster verwenden. – aioobe
Werfen Sie einen Blick auf diese Frage: http://stackoverflow.com/questions/1129795/what-is-suppresswarnings-unched-in-java – stevecross
@aioobe Ich wäre wirklich nett, wenn Sie das mit einem Beispiel erarbeiten. –