Groovy语法是Java语法的精确超集吗?

时间:2010-11-24 22:20:42

标签: java syntax groovy

作为一名Java程序员,我并没有真正的Groovy背景,但我最近使用Groovy来扩展Maven(使用GMaven)。到目前为止,我可以在Groovy中使用我需要的所有Java代码,添加了Groovy糖(元类方法,更多运算符,闭包)。我对Groovy的了解远非完整,但我喜欢它,特别是对于脚本编写而言(我在企业场景中使用非静态类型语言时要小心,但这不是主题)。

无论如何,问题是:

有效的Java代码是否自动有效Groovy代码?(我说的是源代码,而不是编译类,我知道Groovy可以与Java类交互。)或者是否有Java构造在Groovy中是非法的?也许是一个保留的Groovy关键字,可以用作Java中的标识符,还是其他什么?或者Groovy故意被设计为与Java 100%资源兼容?

4 个答案:

答案 0 :(得分:21)

不。以下是groovy中的关键字,但不是Java:

any    as     def    in     with

此外,虽然不是关键字,但delegateowner在闭包中具有特殊含义,如果您不小心,可能会惹恼您。

此外,语言语法也存在一些细微差别。首先,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兼容,但是有很多不同的角落情况。也就是说,它与人们实际编写的代码非常兼容。

答案 1 :(得分:17)

不是。

我最喜欢的不兼容性:文字数组:

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

在Groovy中,此上下文中的花括号应包含闭包,而不是文字数组。

答案 2 :(得分:12)

a page on the Groovy site记录了一些差异,another page which lists gotchas(例如换行符)

还有其他一些事情,一个例子是Groovy不支持do...while循环结构

答案 3 :(得分:5)

其他人已经提供了在Groovy中非法的Java语法示例(例如文字数组)。值得记住的是,在两种语言中,一些合法的语法并不意味着同样的事情。例如在Java中:

foo == bar

身份测试,即foobar是否都指向同一个对象?在Groovy中,这测试对象相等性,即它返回foo.equals(bar)

的结果