Ответ 1
Это связано с gwt-компилятором, как вы говорите правильно. EDIT: Однако, как отметил Даниэль в комментарии ниже, это не относится к gwt-компилятору в целом, но только при использовании GWT-RPC.
Если вы объявляете List вместо ArrayList в качестве возвращаемого типа, gwt-компилятор будет включать в свой скомпилированный код полную List-hierarchy (т.е. все типы, реализующие List). Если вы используете ArrayList, компилятору нужно будет включить иерархию ArrayList (т.е. Все типы, реализующие ArrayList, который обычно является просто ArrayList). Используя интерфейс вместо конкретного класса, вы будете платить штраф за время компиляции и размер вашего сгенерированного кода (и, следовательно, количество кода, которое каждый пользователь должен загружать при запуске вашего приложения).
Вы также просили причину: если вы используете интерфейс (а не конкретный класс), компилятор не знает во время компиляции, какие реализации этих интерфейсов будут использоваться. Таким образом, он включает в себя все возможные реализации.
Что касается вашего последнего вопроса: все методы CAN могут быть объявлены для возврата интерфейса (это то, что вы говорите, правильно?). Однако применяется вышеуказанное наказание.
И к слову: как я понимаю, эта проблема не ограничивается методами. Он применяется ко всем объявлениям типа: переменные, параметры. Всякий раз, когда вы используете интерфейс для объявления чего-то, компилятор будет включать полную иерархию суб-интерфейсов и классов реализации. (Так что, очевидно, если вы объявляете свой собственный интерфейс только с одним или двумя классами реализации, вы не подвергаетесь большому штрафу. Вот как я использую интерфейсы в GWT.)
Короче: используйте по возможности конкретные классы.
(Небольшое предложение: это помогло бы, если бы вы дали отметку времени, когда ссылаетесь на видео.)