No habrá ninguna ClassCastException, excepto cuando su T tiene alguna 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;
}
}
En el ejemplo anterior, habrá no ClassCastException en las primeras 5 llamadas a cast y castBaseNumber. Solo la sexta llamada arroja una ClassCastException, porque el compilador traduce efectivamente el molde() para devolver (Objeto) o y el castBaseNumber() para devolver (Número) o ;. Cuando entra escribir
String s = GenericsTest.<Long> cast("Hallo");
Se podría conseguir un ClassCastException, pero no whithin el fundido método, pero a la asignación a s.
Por lo tanto, creo que su "T" no es solo "T", sino que "T extends Something". Así se puede comprobar:
Object o = decoder.readObject();
if (o instanceof Something)
restoredItem = (T) o;
else
// Error handling
Pero esto todavía va a conducir a un error más tarde, cuando el que utiliza su clase.
public Reader<T extends Number>{...}
Long l = new Reader<Long>("file.xml").getValue(); // there might be the ClassCastException
En este caso, solo los consejos de Tom pueden ser útiles.
reetiquetado de usar etiquetas más comunes de excepción-releated. –