Groovy是Java的超集吗?如果没有,Groovy和Java之间的不兼容性是什么?
通过超集,我的意思是源向后兼容性,在某种意义上说:你可以获取一个Java文件并将其编译为Groovy源文件,它将像以前一样工作。 Groovy的目标是使Java与Java非常相似,以最大限度地减少学习曲线。但是,直到Groovy 1.7不支持匿名内部类等等。
我看过一些提出这种说法的文章,但我没有在Groovy website上看到它验证过。
答案 0 :(得分:7)
Groovy是Java的超集(即源代码兼容)吗?如果没有,现在Java和Groovy之间有什么不兼容性?
Groovy“扩展”Java,Groovy和Java之间存在差异(Java编译器无法编译Groovy文件)。页面Differences from Java列出了Java和Groovy之间的所有主要区别。也就是说,Groovy编译器可以将Groovy文件转换为可以使用Java Intepreter运行的.class文件(这需要groovy-all-VERSION.jar
在CLASSPATH上)。这回答了这个问题吗?
答案 1 :(得分:5)
我在该页面上没有看到的一个区别是重载方法的解决方式。在Java中,它基于参数的编译时类型,而在Groovy中,它基于运行时类型。比如说你在类
中有这些方法void doIt(Object o) {} // Java
void doIt(String s) {} // Groovy
以下代码:
Object o = "foo";
如果是Groovy代码,则使用String参数调用该方法,如果使用Java代码,则使用Object参数调用该方法。 Groovy将此功能称为“多方法”。
答案 2 :(得分:1)
在groovy中,具有包访问权限的属性(我应该调用该属性或实例变量)可以自动将setter和getter方法编译到类文件中。
这意味着如果您将* .java文件另存为* .groovy文件并且您具有“String name;”之类的属性groovy编译器将生成一个setter和一个getter。 java编译器不会。如果你的java文件中已有getter,那么groovy编译器甚至可能会抱怨重复的方法定义。
但是,除非极少数情况下,大多数* .java文件都由groovy编译器编译而没有问题。
安吉洛
答案 3 :(得分:0)
该页面上未列出的另一个区别是使用分号。每行应该能够以分号结尾(但可以省略)。
以下代码不能在Groovy上编译,而是在Java上编译:
String s = "hello "
+ "world";
println(s); // Assuming there is a local method with name "println" (available by default in Groovy but you have to create it in Java)