Не будет никакого ClassCastException, за исключением случаев, когда у вашего T есть какая-то база:
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;
}
}
В приведенном выше примере не будет ClassCastException в первых 5 вызовах cast и castBaseNumber. Только 6-й вызов генерирует исключение ClassCastException, потому что компилятор эффективно переводит cast() в return (Object) o и castBaseNumber() в return (Number)o;. Вэнн ты пишешь
String s = GenericsTest.<Long> cast("Hallo");
Вы получите ClassCastException, но не в методе приведения, а при назначении s.
Поэтому я думаю, что ваше «Т» — это не просто «Т», а «Т расширяет Что-то». Итак, вы можете проверить:
Object o = decoder.readObject();
if (o instanceof Something)
restoredItem = (T) o;
else
// Error handling
Но это все равно приведет к ошибке позже, когда вы используете свой класс.
public Reader<T extends Number>{...}
Long l = new Reader<Long>("file.xml").getValue(); // there might be the ClassCastException
В этом случае может помочь только совет Тома.
person
Tobias Schulte
schedule
09.10.2008