код на Java является валидным
динамический язык с котролем типов
во время исполнения (int c = “” //cast error)широкий набор импортов по умолчанию
primitives - по факту почти всегда используются объекты-обёртки
def - синоним типа Object
методы всегда возвращают значение - void = null
коллекции по умолчанию сохраняют порядок инициализации - в Java коллекции могут выдавать совершенно разный порядок при разных запусках int[] array = [1,2,3] vs int[] array = {1, 2, 3}
Нет try-with-resources, зато есть @AutoCleanup в Spock
Closure - это Lambda, которая умеет менять внешние переменные
== - это compareTo (для сравниваемых объектов) или equals иначе таким образом, == может быть несимметричным, например, для GString vs String для сравнивания ссылок используйте метод is: 128.is(128)
позволяет перегружать операторы
необязательные: `;` в конце, return, скобки при вызове функции, public классы и методы
реализует множественное наследование с помощью trait (аналог интерфейса в Java)
switch оператор позволяет использовать почти любые условия для сравнения (isCase метод), например, тип объекта, сравнение по equals, вхождение в коллекцию, удовлетворение регулярному выражению и даже просто Closure)
необязательная декларация для checked exceptions