代码之家  ›  专栏  ›  技术社区  ›  Sean Patrick Floyd

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

  •  31
  • Sean Patrick Floyd  · 技术社区  · 15 年前

    作为一个Java程序员,我并没有真正的Groovy背景,但是最近我经常使用Groovy来扩展Maven(使用GMAVEN)。到目前为止,我可以使用Groovy中需要的所有Java代码和添加的Groovy糖(元类方法、更多的操作符、闭包)。我对groovy的了解还远远不够,但我喜欢它,尤其是出于脚本目的(我对在企业场景中使用非静态类型化语言有点谨慎,但这不是本文的主题)。

    不管怎样,问题是:

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

    4 回复  |  直到 15 年前
        1
  •  17
  •   Sean Patrick Floyd    15 年前

    不是这样。

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

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

    在groovy中,此上下文中的大括号应该包含一个闭包,而不是文本数组。

        2
  •  21
  •   ataylor    15 年前

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

    any    as     def    in     with
    

    此外,虽然不是关键字, delegate owner 在闭包中有特殊的意义,如果你不小心的话会绊倒你。

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

        3
  •  12
  •   tim_yates    15 年前

    a page on the Groovy site 其中记录了一些差异,以及 another page which lists gotchas (比如新品)

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

        4
  •  5
  •   Dónal    15 年前

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

    foo == bar
    

    身份测试,即Do foo bar 两者都指向同一对象?在groovy中,这个测试对象是否相等,即返回 foo.equals(bar)