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

2022-09-01 09:39:44

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

无论如何,问题是:

每一点有效的 Java 代码都是自动有效的 Groovy 代码吗?(我说的是源代码,而不是编译类,我知道Groovy可以与Java类进行交互。或者,在Groovy中是否存在非法的Java结构?也许是一个保留的Groovy关键字,可以用作Java中的标识符,或者其他东西?还是Groovy被故意设计为与Java100%源代码兼容?


答案 1

不。以下是 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源代码兼容,但有很多角落情况并不相同。也就是说,它与人们实际编写的代码非常兼容。


答案 2

事实并非如此。

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

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

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