Вот список элементов, которые действительны для Java 6, но не действительны для Groovy 1.6. Это не полный список, но я думаю, что он охватывает большинство случаев. Некоторые из них разрешены более поздними версиями Groovy, как указано ниже.
(Кстати, я думаю, вы должны заметить, что нестатические блоки инициализации действительно работают в Groovy.)
Любое объявление внутреннего класса в Groovy 1.6 ( 1.7 добавленные внутренние классы ):
включая статические,
public class Outer{
static class Inner{}
}
нестатическая
public class Outer{
class Inner{}
}
местные классы,
public class Outer{
public static void main(String[] args) {
class Local{}
}
}
и анонимные классы
java.util.EventListener listener=new java.util.EventListener(){};
Использование ключевых слов Groovy в качестве переменных не будет работать ни в одной версии Groovy:
int def;
int in;
int threadsafe;
int as;
Инициализация массива Java
String[] stuff=new String[]{"string"};
int[] array={1,2,3};
Используйте формат массива Groovy, изменив {...}
на [...]
.
Использование знаков доллара в строках, где нижеследующее не является допустимым выражением
String s="$$";
String s="$def";
String s="$enum";
String s="$;";
String s="$\\";
//etc.
Более одного инициализатора в цикле for
for (int i=0, j=0; i < 5; i++) {}
Более одного приращения цикла for
int j=0;
for (int i=0; i < 5; i++,j++) {}
Разбиение некоторых выражений с помощью символов новой строки
int a= 2
/ 2
;
Подсказка: используйте продолжение строки с обратной косой чертой в Groovy
int a= 2 \
/ 2 \
;
Концевой выключатель в корпусе без корпуса
switch(a){
case 1:
}
Наличие по умолчанию в коммутаторе без тела
Применяется в обоих случаях, когда по умолчанию в конце
int a=0;
switch(a){
default:
}
или где-то посередине
switch(a){
default:
case 1:
break;
}
Аннотации со списками
@SuppressWarnings({"boxing","cast"})
Подсказка: используйте вместо этого буквенный синтаксис Groovy:
@SuppressWarnings(["boxing","cast"])
Объявление собственного метода
public native int nativeMethod();
** Класс на enum в 1.6 (действительно в более поздних версиях Groovy) **
public enum JavaEnum{
ADD{
public String getSymbol(){ return "+"; }
};
abstract String getSymbol();
}
Do loop
do{
System.out.println("stuff");
}while(true);
Равенство
Хотя технически ==
является допустимым Groovy и Java, он семантически отличается. Это одна из причин, по которой вы не можете полагаться на простую компиляцию Java в Groovy без изменений. Хуже того, может показаться, что это иногда работает из-за интернирования строк Java.
Пример был слишком длинным, чтобы добавить его к существующему ответу, но дело в том, что Java-код, синтаксически допустимый, так как Groovy может вести себя по-другому во время выполнения .
Чтобы получить тот же результат, что и в Java x == y
для двух ненулевых объектов, вам нужно x.is(y)
в Groovy. x == y
действительно Groovy, просто делает что-то другое .
Документация Groovy содержит более подробный и широкий список различий .