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