Ответ 1
Это не так.
Моя любимая несовместимость: литеральные массивы:
String[] s = new String[] {"a", "b", "c"};
В Groovy ожидается, что фигурные скобки в этом контексте будут содержать замыкание, а не литерал.
Будучи программистом на Java, у меня действительно нет фона Groovy, но в последнее время я использую Groovy для расширения Maven (используя GMaven). До сих пор я мог использовать весь код Java, который мне нужен, в Groovy с добавленным сахаром Groovy (методы метакласса, больше операторов, закрытие). Мои знания о Groovy далеки от завершения, но мне это нравится, особенно для целей Scripting (я немного осторожен в использовании нестатического типизированного языка в корпоративном сценарии, но это не тема здесь).
В любом случае, вопрос:
Является ли каждый бит допустимого кода Java автоматически действительным Groovy code? (я говорю об Исходном коде, а не о компилируемых классах, я знаю, что Groovy может взаимодействовать с Java-классами.) Или существуют ли Java-конструкции, которые являются незаконными в Groovy? Возможно, зарезервированное ключевое слово Groovy, которое может использоваться как идентификатор в Java или что-то еще? Или Groovy намеренно был разработан для совместимости с Java на 100%?
Это не так.
Моя любимая несовместимость: литеральные массивы:
String[] s = new String[] {"a", "b", "c"};
В Groovy ожидается, что фигурные скобки в этом контексте будут содержать замыкание, а не литерал.
Неа. Ниже перечислены ключевые слова в 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, есть много угловых случаев, которые не совпадают. Тем не менее, он очень совместим с тем, что люди на самом деле пишут.
Здесь страница на Groovy сайте, которая документирует некоторые из различий, и другую страницу, в которой перечислены gotchas (например, вещь новой строки)
Есть и другие вещи: один пример: Groovy не поддерживает конструкцию цикла do...while
Другие уже приводили примеры синтаксиса Java, который является незаконным в Groovy (например, литеральных массивах). Также стоит помнить, что некоторый синтаксис, который является законным в обоих, не означает одно и то же на обоих языках. Например, в Java:
foo == bar
тесты для идентификации, т.е. foo
и bar
оба относятся к одному и тому же объекту? В Groovy это проверяет равенство объекта, т.е. Возвращает результат foo.equals(bar)