【问题标题】:Groovy Superset of Java [duplicate]Java的Groovy超集[重复]
【发布时间】:2010-12-29 20:55:49
【问题描述】:

Groovy 是 Java 的超集吗?如果不是,Groovy 和 Java 之间有什么不兼容的地方?

我所说的超集是指源代码向后兼容性,从某种意义上说:您可以获取一个 Java 文件并将其编译为 Groovy 源文件,它会像以前一样工作。 Groovy 的目标一直是与 Java 非常相似,以最小化学习曲线。但是,直到 Groovy 1.7 才支持匿名内部类等。

我看到一些文章提出这样的说法,但我没有看到它在 Groovy website 上得到验证。

【问题讨论】:

  • 实际上,我不确定我是否理解了这个问题。 “源兼容”到底是什么意思?

标签: java groovy compatibility superset


【解决方案1】:

Groovy 是 Java 的超集(即源代码兼容)吗?如果没有,现在 Java 和 Groovy 之间的不兼容是什么?

Groovy “扩展” Java,Groovy 和 Java 之间存在差异(Java 编译器无法编译 Groovy 文件)。 Differences from Java 页面列出了 Java 和 Groovy 之间的所有主要区别。也就是说,Groovy 编译器可以将 Groovy 文件转换为可以使用 Java 解释器运行的 .class 文件(这需要 groovy-all-VERSION.jar 位于 CLASSPATH 上)。这能回答问题吗?

【讨论】:

  • 谢谢,我更新了问题以澄清我的观点。
【解决方案2】:

我在该页面上没有看到的一个区别是重载方法的解决方式。在 Java 中,它基于参数的编译时类型,而在 Groovy 中,它基于运行时类型。比如说你在一个类中有这些方法

void doIt(Object o) {}  // Java
void doIt(String s) {}  // Groovy

以下代码:

Object o = "foo";

如果是 Groovy 代码,将调用带有 String 参数的方法,如果是 Java 代码,则调用带有 Object 参数的方法。 Groovy 将此功能称为“多方法”。

【讨论】:

  • 谢谢。这在文献中被称为“多方法动态调度”。
【解决方案3】:

在 groovy 中,具有包访问权限的属性(嗯,我应该称之为属性或实例变量)会自动将 setter 和 getter 方法编译到类文件中。

这意味着如果你将 *.java 文件保存为 *.groovy 文件并且你有一个像“String name;”这样的属性。 groovy 编译器将生成一个 setter 和一个 getter。 java编译器不会。如果您的 java 文件中已经有一个 getter,那么 groovy 编译器甚至可能会抱怨重复的方法定义。

但是,除非在极少数情况下,大多数 *.java 文件都可以由 groovy 编译器编译而不会出现问题。

安杰洛

【讨论】:

    【解决方案4】:

    该页面上未列出的另一个区别是分号的使用。每行应该能够以分号结尾(但可以省略)。

    以下代码不在 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 2017-04-12
      • 2011-02-19
      相关资源
      最近更新 更多