Вот список элементов, которые допустимы для 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();
** Класс на перечисление в 1.6 (действительно в более поздних версиях Groovy) **
public enum JavaEnum{
ADD{
public String getSymbol(){ return "+"; }
};
abstract String getSymbol();
}
Выполнить цикл
do{
System.out.println("stuff");
}while(true);
Равенство
Хотя технически == является допустимым для Groovy и Java, семантически он отличается. Это одна из причин, по которой нельзя полагаться только на компиляцию Java как Groovy без изменений. Хуже того, иногда может показаться, что это срабатывает из-за интернирования строк Java.
Пример был слишком длинным, чтобы добавить его к существующему ответу, но дело в том, что код Java, который синтаксически действителен как Groovy, может вести себя по-другому во время выполнения.
Чтобы получить тот же результат, что и x == y в Java для двух ненулевых объектов, вам понадобится x.is(y) в Groovy. x == y действительно Groovy, он просто делает что-то другое.
В документации Groovy есть более подробный и более широкий список различий.
person
Peter Dolberg
schedule
11.04.2009