哪些Kotlin功能在静态编译的Groovy中不可用?

时间:2016-03-13 17:13:57

标签: groovy kotlin

如果我们静态编译Groovy,Kotlin和Groovy看起来非常相似,并且具有非常相似的功能。哪些功能,除了安全性之外,Kotlin在Groovy中缺少哪些功能?

2 个答案:

答案 0 :(得分:24)

Kotlin是一种JVM语言,IMO正试图在功能和简洁性方面改进Java,同时保持势在必行和静态。 Groovy有一个类似的概念,除了决定动态。因此,许多语言功能都是类似的。

以下是我所知道的一些差异

  • 静态与动态:由于Groovy被设计为动态语言,而@CompileStatic,虽然是一个很好的注释(我经常使用它),但后来又添加了。它的功能感觉有点蠢蠢欲动,并没有强制人们以静态方式编码。它无法在任何地方使用(例如我的Spock测试似乎无法与它们一起编译)。有时即使在Groovy上使用它仍然似乎偶尔有一些奇怪的动态行为。 Kotlin是100%静态,动态不是一种选择。

虽然有许多其他功能。我建议您查看参考文献,您可能会发现更多信息,例如https://kotlinlang.org/docs/reference/

  • 数据类 - 简化了复制功能(有点像Scala中的case类)
  • 您提到的空安全检查(这是一个很大的专业人员)
  • 破坏物品的能力。 val(姓名,年龄)=人
  • 高阶函数,定义为"有趣的doStuff(正文:Int - > T)):T"。哪个比常规的闭包IMO要好得多。 (非常类似于Scala')
  • 类型检查和智能广播很不错:https://kotlinlang.org/docs/reference/typecasts.html
  • Companion Objects,就像Scala也试图从类中删除静态方法一样,Kotlin尝试了同样的事情。
  • 密封类以限制继承(再次Scala有类似的东西)
  • "没什么"子类型,其中一切都是它的超类型。 (Scala中的另一个重要概念)。
  • 当基本模式匹配的表达式:https://kotlinlang.org/docs/reference/control-flow.html

正如您所看到的,它确实借用了除Groovy之外的其他语言。他们试图挑选一些很棒的功能,试图创造一种好的语言。自然Groovy有自己的优点。我只关注Kotlin的一个而不是反之亦然

另一个优点是,由IDE制造商制作,编译器非常快速并且具有出色的IDE支持。不是说Groovy没有很好的支持,但我当前的项目确实需要很长时间才能编译,而重构方法总是假设你是以动态方式编码。

我建议您尝试使用Koans来感受他们,看看您喜欢哪种语言的功能以及它与groovy(https://github.com/Kotlin/kotlin-koans)的比较。

答案 1 :(得分:5)

Kotlin 设计为静态类型语言,具有良好的类型系统和静态类型语言的其他好处。 Groovy - 首先是一种动态类型语言,只有这样 - 静态。

当你在groovy中启用compile static时,你只得到带有语法糖的java。另一方面 - Kotlin在其类型系统中有两种类型的引用:nullable and nonnullable,因此您可以编写具有较少NPE的代码。如果您只询问一个功能 - 那就是它。

Kotlin的第二个重要特征 - 它没有做任何隐式转换,另一方面 - groovy隐式地将double转换为bigdecimal等等。

但kotlin还有很多其他功能,例如smart castsADTdoc),type-safe builders,零成本抽象以及最终的IDE支持。

另外我不确定Groovy的类型推理的质量(例如我们需要additional annotations,关闭),但在Kotlin类型推理工作中一种魅力,在每一种语言中都没有任何注释。

所以Kotlin中的静态类型编译 - 一流的公民,在Groovy中 - 不是。