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

如果我们静态编译Groovy,Kotlin和Groovy看起来非常相似,语言非常相似。 除了无效安全之外,哪些功能在Groovy中缺少Kotlin?

Kotlin是一种JVM语言,IMO正在努力在功能和简洁性方面改进Java,同时保持势在必行和静态。 Groovy有一个类似的概念,除了决定走向动态。 结果,一些语言特征将是相似的。

这是我意识到的一些差异

  • 静态与动态:由于Groovy被设计成动态语言,而@CompileStatic,后来又增加了一个很好的注释(我用了很多)。 它的功能感觉有点疯狂,并没有强制人们以静态的方式进行编码。 在任何地方都无法使用(例如我的Spock测试似乎无法与它们一起编译)。 有时即使在Groovy上,它也似乎有时会出现一些奇怪的动态行为。 Kotlin是100%静态的,动态不是一个选项。

但是还有一些其他功能。 我建议你看看参考文献,你可能会发现一些更多,例如https://kotlinlang.org/docs/reference/

  • 数据类 – 简洁的复制功能(有点像在斯卡拉案例类)
  • 你提到的无效安全检查(这是一个大的专业人士)
  • 破坏物品的能力。 val(姓名,年龄)=人
  • 高阶函数,定义如“fun doStuff(body:Int – > T)):T”。 哪一个比常规的海事IMO更好。 (非常类似于Scala的)
  • 类型检查和智能转换是很好的: https : //kotlinlang.org/docs/reference/typecasts.html
  • Companion Objects,就像Scala也试图从类中移除静态方法一样,Kotlin也是这样做的。
  • 密封类来限制继承(Scala也有类似的东西)
  • “Nothing”子类型,其中的一切都是超类型的。 (另一个关键的概念在斯卡拉)。
  • 当表达式进行基本模式匹配时: https : //kotlinlang.org/docs/reference/control-flow.html

正如你可以看到它从Groovy以外的其他语言借用。 他们试图挑选一些伟大的功能,试图做一个好的语言。 自然Groovy有它自己的善良。 我只专注Kotlin的一个,而不是反之亦然

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

我建议你尝试一下Koans,让他们看看你喜欢哪种语言的特性,以及它如何与groovy( https://github.com/Kotlin/kotlin-koans )进行比较。

Kotlin被设计成静态类型语言,具有很好的类型系统和静态类型语言的其他好处。 Groovy – 首先是动态类型语言,然后才是静态的。

当你在groovy中启用编译静态时,你只会得到语法糖的java。 另一方面,Kotlin在他们的类型系统中有两种类型的引用:可以为空或者不可空 ,所以你可以用较少的NPE编写代码。 如果您只问一个功能 – 就是这样。

Kotlin的第二大特性 – 不会做任何隐式转换,另一方面,groovy会将double转换为bigdecimal等等。

但是kotlin还有很多其他功能,如智能转换 , ADT ( doc ), 类型安全的构建器 ,零成本的抽象以及最终的IDE支持。

此外,我不确定Groovy的类型推断的质量(例如,我们需要额外的注释 ,呃),但是Kotlin类型推理工作就像一种魅力,在语言的每一种安宁中都没有任何注释。

所以静态类型编译在Kotlin – 一等公民,在Groovy – 不是。