Короче говоря, возвращающий объект типа ArrayList, который может быть брошена в любой другой тип объекта, который реализует список не представляется возможным , Элементы могут быть перемещены и добавлены к другому типу объекта, но сам тип коллекции не может быть отброшен.
Я объясню, почему. Когда вы говорите,
List<String> list = new ArrayList<String>();
ссылочный тип «список» - это список, а тип объекта - ArrayList. Объект «list», который вы теперь используете, дает вам доступ ко всем методам интерфейса List, но не к другим методам, которые ArrayList имеет, хотя объект списка может их видеть (вроде сужения преобразования). Вы можете отбросить этот объект списка обратно к объекту ArrayList, и это сработает, потому что экземпляр списка в любом случае может видеть методы, которые ArrayList имел и, следовательно, отбрасывает это назад, будет работать (вроде как расширение преобразования обратно к исходной ширине).
Но если вы должны были передать его одному из других классов, реализующих интерфейс List, например LinkedList или Vector или Stack, что произойдет? Экземпляр списка не знает, как реализуются другие методы, присутствующие в LinkedList, Vector или Stack (поскольку они не находятся в ArrayList). Так что это похоже на конверсию, в которой вы не знаете, что нужно сделать. Поэтому он отбросит ошибку компилятора.
Расширение этого, вы можете увидеть, если у вас:
List<String> list = new LinkedList<String>();
сейчас, бросая список обратно в LinkedList будет работать, но не обратно в ArrayList.
Вы знакомы с ['generics'] (https://docs.oracle.com/javase/tutorial/java/generics/boundedTypeParams.html)? –