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

Sea*_*oyd 31 java syntax groovy

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

无论如何,问题是:

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

ata*_*lor 21

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

any    as     def    in     with
Run Code Online (Sandbox Code Playgroud)

此外,虽然不是关键字,delegate并且owner在封闭特殊的含义,如果你不小心可能你绊倒.

此外,语言语法也存在一些细微差别.首先,Java在声明中出现数组括号的位置更加灵活:

public static void main(String args[]) // valid java, error in groovy
Run Code Online (Sandbox Code Playgroud)

Groovy的解析方式也不同.这是一个例子:

public class Test {
    public static void main(String[] args) {
        int i = 0;
        i = 5
        +1;
        System.out.println(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

Java将打印6,groovy将打印5.

虽然groovy主要与java兼容源代码,但是有很多不一样的极端情况.也就是说,它与人们实际编写的代码非常兼容.

  • Java中的`String args []`表示法很糟糕(让我想起了我讨厌C的所有事情).很高兴听到Groovy没有那个. (5认同)

Gor*_*vic 17

事实并非如此.

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

String[] s = new String[] {"a", "b", "c"};
Run Code Online (Sandbox Code Playgroud)

在Groovy中,这个上下文中的花括号应该包含一个闭包,而不是一个文字数组.

  • @Goran在声明类型时,你不需要那个例子中的`as` ...`String [] arr = ['a','b','c']`就够了 (4认同)
  • groovy版本将是`String [] s = ["a","b","c"];`? (2认同)
  • ^^差不多.[]语法创建一个列表.但是,如果您在行尾添加"as String []" (2认同)
  • 在这种情况下接受答案并不容易,它们都很好,没有一个正确的答案.所以我给戈兰打了一个复选标记,因为他的代表最低. (2认同)

tim*_*tes 12

Groovy网站上一个页面记录了一些差异,另一个页面列出了陷阱(例如换行符)

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

  • 谢谢.*一个例子是Groovy不支持do ... while循环构造*也是好事.我开始觉得Groovy从Java那里拿走了所有好东西,遗漏了所有可怕的东西.这提出了一个显而易见的问题:Groovy是否有循环标签? (3认同)

Dón*_*nal 5

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

foo == bar
Run Code Online (Sandbox Code Playgroud)

身份测试,即do foobarboth都指向同一个对象?在Groovy中,这会测试对象的相等性,即返回结果foo.equals(bar)

  • 我不同意.我认为这是一个很好的功能.测试平等是更常见的情况,并不依赖于不那么直观的身份概念.通过重写`equals()`方法,对象编写者可以完全控制它.身份测试刚性由语言定义和暴露丑陋的Java不一致像'新长征(1)!=新龙(1)``但Long.valueOf(1)== Long.valueOf(1)`.Groovy使"好"的情况使用运算符(可读,直观),"坏"情况使用方法调用(将其标记为异常以备注).Java正好相反. (8认同)