Почему это общее приведение не завершается неудачно?

Я бы ожидал этот код для создания исключения 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 (), ничего не делая с результатом, все работало нормально. В коде это не удалось.

Почему не выходит из строя напрямую? Это ошибка? Если нет, то я хотел бы понять, почему.

5
задан Michel Jung 19 November 2010 в 12:41
поделиться