Nie będzie żadnych ClassCastException, z wyjątkiem, gdy T ma pewne podstawy:
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;
}
}
w powyższym przykładzie, nie będzie brak wyjątku ClassCastException w pierwszych 5 wywołaniach Cast i CastBaseNumber. Tylko szóste połączenie rzuca wyjątek ClassCastException, ponieważ kompilator skutecznie tłumaczy metodę cast() na return (Object) o i castBaseNumber() na return (Number) o ;. Wenn piszesz
String s = GenericsTest.<Long> cast("Hallo");
Można by dostać ClassCastException, ale nie w obrębie tej metody odlewania, ale na przypisanie do s.
Dlatego uważam, że twoje "T" to nie tylko "T", ale "T rozszerza coś". Więc można sprawdzić:
Object o = decoder.readObject();
if (o instanceof Something)
restoredItem = (T) o;
else
// Error handling
Ale to nadal będzie prowadzić do błędu później, gdy używasz klasę.
public Reader<T extends Number>{...}
Long l = new Reader<Long>("file.xml").getValue(); // there might be the ClassCastException
W tym przypadku może pomóc tylko radę Toma.
Retagged użyć bardziej popularne tagi wyjątku releated. –