Подтвердить что ты не робот

Строка присваивается списку без ошибки компиляции

Как я знаю, одной из основных целей дженериков в Java является обеспечение безопасности типа компиляции. Если он скомпилирован, код будет работать без проблем.

Тогда почему скомпилирован следующий код?

public static void main(String[] args) {
    String s = getList();
}

private static <T extends List> T getList() {
    return (T)new ArrayList();
}

Он компилируется отлично. Где моя безопасная для текста компиляция? Метод getList() не имеет ничего общего с классом String.

4b9b3361

Ответ 1

Это не проблема стирания типа как таковая, а почти наоборот: у вас возникает проблема во время выполнения, когда система знает фактические типы, но не во время компиляции. Причина этого компиляции заключается в том, что List является интерфейсом. Что касается компилятора, то подкласс String может фактически реализовать этот интерфейс, поэтому компилятор считает, что могут быть допустимые условия выполнения, когда фактический возвращенный объект является String, который также является List. Компилятор не считает, что String является окончательным и, следовательно, невозможно создать класс List -implementing String.

Что касается того, почему окончательный вариант не рассматривается во время компиляции, богемский комментарий к вопросу дает хорошее объяснение.