Подтвердить что ты не робот

Является ли синтаксис Groovy точным расширением синтаксиса Java?

Будучи программистом на Java, у меня действительно нет фона Groovy, но в последнее время я использую Groovy для расширения Maven (используя GMaven). До сих пор я мог использовать весь код Java, который мне нужен, в Groovy с добавленным сахаром Groovy (методы метакласса, больше операторов, закрытие). Мои знания о Groovy далеки от завершения, но мне это нравится, особенно для целей Scripting (я немного осторожен в использовании нестатического типизированного языка в корпоративном сценарии, но это не тема здесь).

В любом случае, вопрос:

Является ли каждый бит допустимого кода Java автоматически действительным Groovy code? (я говорю об Исходном коде, а не о компилируемых классах, я знаю, что Groovy может взаимодействовать с Java-классами.) Или существуют ли Java-конструкции, которые являются незаконными в Groovy? Возможно, зарезервированное ключевое слово Groovy, которое может использоваться как идентификатор в Java или что-то еще? Или Groovy намеренно был разработан для совместимости с Java на 100%?

4b9b3361

Ответ 1

Это не так.

Моя любимая несовместимость: литеральные массивы:

String[] s = new String[] {"a", "b", "c"};

В Groovy ожидается, что фигурные скобки в этом контексте будут содержать замыкание, а не литерал.

Ответ 2

Неа. Ниже перечислены ключевые слова в groovy, но не Java:

any    as     def    in     with

Кроме того, в то время как не ключевые слова, delegate и owner имеют особое значение в закрытии и могут отключить вас, если вы не будете осторожны.

Кроме того, существуют некоторые незначительные различия в синтаксисе языка. Во-первых, Java более гибко относится к тому, где в объявлениях встречаются массивы:

public static void main(String args[]) // valid java, error in groovy

Groovy также анализируется по-разному. Вот пример:

public class Test {
    public static void main(String[] args) {
        int i = 0;
        i = 5
        +1;
        System.out.println(i);
    }
}

Java будет печатать 6, groovy будет печатать 5.

В то время как groovy в основном совместим с версией java, есть много угловых случаев, которые не совпадают. Тем не менее, он очень совместим с тем, что люди на самом деле пишут.

Ответ 4

Другие уже приводили примеры синтаксиса Java, который является незаконным в Groovy (например, литеральных массивах). Также стоит помнить, что некоторый синтаксис, который является законным в обоих, не означает одно и то же на обоих языках. Например, в Java:

foo == bar

тесты для идентификации, т.е. foo и bar оба относятся к одному и тому же объекту? В Groovy это проверяет равенство объекта, т.е. Возвращает результат foo.equals(bar)