Я сегодня прогал на Java, т.к. помогаю другу в занятиях по проге. Пока писал бойлерплейты для задач, немного охеревал от дизайна языка. А именно:
1) Нельзя создать обычные массивы с generic type. Если нужны дженерики, надо юзать ArrayList;
2) Функций вне классов не существует. Если нужны функции которые не привязаны к инстансу, надо создать класс со static методами;
3) Если метод интерфейса в каком-нибудь классе бросает исключение, то надо в интерфейсе задать что метод бросает исключение
Как следствие из 2, указателей на функции тоже. Для того, чтобы использовать колбэк, предикат и пр. в методе или задать определенное поведение объекту, требуется сначала создать инстанс который оверрайднет определенный метод или который от класса, который оверрайдает метод наследуемого.
Незря в Java есть интерфейсы и абстрактные классы/методы для этого