Il n'y aura pas de ClassCastException, sauf si votre T a une certaine base:
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;
}
}
Dans l'exemple ci-dessus, il y aura aucune exception ClassCastException dans les 5 premiers appels à cast et castBaseNumber. Seul le 6ème appel lève une exception ClassCastException, car le compilateur convertit efficacement cast() en retour (Object) o et castBaseNumber() en renvoie (Number) o ;. Wenn vous écrivez
String s = GenericsTest.<Long> cast("Hallo");
Vous obtiendrez un ClassCastException, mais pas whithin la méthode de distribution, mais l'affectation à l'art.
Par conséquent, je pense que votre "T" n'est pas seulement "T", mais "T extends Something". Donc, vous pouvez vérifier:
Object o = decoder.readObject();
if (o instanceof Something)
restoredItem = (T) o;
else
// Error handling
Mais cela conduira encore à une erreur plus tard, lorsque vous utilisez votre classe.
public Reader<T extends Number>{...}
Long l = new Reader<Long>("file.xml").getValue(); // there might be the ClassCastException
Dans ce cas, seuls les conseils de Tom peuvent vous aider.
Retagged à utiliser exceptions releated plus courantes balises. –