Я недавно читал об этом здесь, на SO (и сейчас не могу найти ссылку, но это одна из тех публикаций «почему динамические языки хороши?», И большой ответ С. Лотта с много комментариев), и ответ:
Ты мог бы. В частности, в Groovy вы можете определять интерфейсы в Java или Groovy и реализовывать их. Тем не менее, с помощью утиной типизации (которую Groovy допускает, но также допускает явные типы) многие люди скажут «зачем?» Источник - это собственная документация, интерфейс в источнике, «используйте источник» и т. Д.
Лично, это сводит меня с ума - я люблю проверки времени компиляции (или действительно, времени разработки), которые Java дает мне, но это - другая дискуссия. Если вы используете Groovy, то это потому, что вы хотите написать этот блестящий лаконичный и понятный код, который получается из-за утки. В этом случае следует избегать интерфейсов, кроме случаев, когда это необходимо.
Где они нужны? Между частями программы и в Public API для программы (хотя они также могут быть абстрактными классами). В противном случае, я бы сказал, что вам следует избегать их на языках утки. Это заставляет вас писать документы по классам или писать код, который настолько ясен, что это одно и то же.
Я думаю, что это ужасная практика, ОДНАКО это часть перехода парадигмы к динамическим языкам. И я думаю, что если вы избежите достаточного отделения интерфейса от реализации, вы поймете «почему». Я до сих пор не знаю, хотя это во многом связано с неповторяющимся кодом (сохранение DRY).
Редактировать: Получил некоторую ясность от компьютера :) Одна из главных причин НЕ отделять интерфейс от реализации состоит в том, что вы уходите от зависимости от типов . Как вы знаете, при наборе утки меня не волнует, является ли он реализатором интерфейса Vehicle
(например). Меня волнует только если у него есть go
метод с 2 параметрами. Таким образом, чем больше вы работаете с интерфейсами, тем больше вы пишете Java на Groovy («вы можете писать на Фортране на любом языке»). Этого следует избегать, так как новые языки открывают вам новые возможности.