这里列出了有效的 Java 6,但无效的 Groovy 1.6。这不是一个完整的列表,但我认为它涵盖了大多数情况。其中一些是更高版本的 Groovy 允许的,如下所述。
(顺便说一句,我认为您应该注意,非静态初始化块确实可以在 Groovy 中工作。)
Groovy 1.6 (1.7 added inner classes) 中的任何内部类声明:
包括静态,
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 字符串实习,它有时似乎可以工作。
该示例太长,无法添加到现有答案中,但重点是 语法上作为 Groovy 有效的 Java 代码在运行时可能会表现不同。
要获得与 Java 的 x == y 相同的结果,对于两个非空对象,您需要在 Groovy 中使用 x.is(y)。 x == y 是有效的 Groovy,它只是做了一些不同的事情。
The Groovy documentation has a more detailed and broader list of differences.