Es wird jede Classcast nicht sein, es sei denn, Ihr T eine Basis hat:
public class GenericsTest
{
public static void main(String[] args)
{
System.out.println(cast(Integer.valueOf(0)));
System.out.println(GenericsTest.<Long> cast(Integer.valueOf(0)));
System.out.println(GenericsTest.<Long> cast("Hallo"));
System.out.println(castBaseNumber(Integer.valueOf(0)));
System.out.println(GenericsTest.<Long> castBaseNumber(Integer.valueOf(0)));
System.out.println(GenericsTest.<Long> castBaseNumber("Hallo"));
}
private static <T extends Number> T castBaseNumber(Object o)
{
T t = (T)o;
return t;
}
private static <T> T cast(Object o)
{
T t = (T)o;
return t;
}
}
Im obigen Beispiel wird es Keine ClassCastException in den ersten 5 Aufrufen von Cast und CastBaseNumber. Nur der 6. Aufruf löst eine ClassCastException aus, da der Compiler das cast() so umsetzt, dass er (Object) o zurückgibt, und castBaseNumber(), um (Number) o; zurückzugeben. If Sie schreiben
String s = GenericsTest.<Long> cast("Hallo");
Sie würden eine Classcast bekommen, aber nicht whithin der guss Methode, aber bei der Zuordnung zu s.
Ich glaube daher, Ihre "T" ist nicht nur "T", sondern "T erweitert Something". So könnte man überprüfen:
Object o = decoder.readObject();
if (o instanceof Something)
restoredItem = (T) o;
else
// Error handling
Aber das führt immer noch zu einem Fehler später, wenn Sie Ihre Klasse verwenden.
public Reader<T extends Number>{...}
Long l = new Reader<Long>("file.xml").getValue(); // there might be the ClassCastException
Für diesen Fall könnte nur Toms Ratschlag helfen.
Retagged nutzen können häufige Ausnahme-releated-Tags zu verwenden. –