Я бы ожидал этот код для создания исключения ClassCastException:
public class Generics {
public static void main(String[] args) {
method(Integer.class);
}
public static <T> T method(Class<T> t) {
return (T) new String();
}
}
Но это не так. Преобразование String в T не завершается неудачно, пока я не использую возвращенный объект каким-либо образом, например:
public class Generics {
public static void main(String[] args) {
method(Integer.class).intValue();
}
public static <T> T method(Class<T> t) {
return (T) new String();
}
}
Предпосылки: я создал класс, который использует JAXB для демаршализации XML-файл. Он выглядит следующим образом:
public static <T> T unmarshal(File file, Class<? extends T> clazz)
В зависимости от того, является ли корневой элемент анонимным типом, либо T, либо JAXBElement возвращается. JAXBElement, конечно, не может быть преобразован в T. В моем модульном тесте, где я только вызвал unmarshal (), ничего не делая с результатом, все работало нормально. В коде это не удалось.
Почему не выходит из строя напрямую? Это ошибка? Если нет, то я хотел бы понять, почему.