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

Jan*_*lek 17 groovy kotlin

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

Bru*_*owe 25

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

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

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

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

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

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

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

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

  • 我发现在Groovy中缺少的另一个Kotlin功能是命名参数.可以使用地图传播在某种程度上模拟它,但似乎没有办法将标准参数与命名参数结合起来:`someMethod("foo",10,color:RED,verbose:true)` (2认同)

Rus*_*lan 5

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

当您在groovy中启用编译静态时,您只能获得带语法糖的java.另一方面--Kotlin在其类型系统中有两种类型的引用:可空和不可,因此您可以编写具有较少NPE的代码.如果你只询问一个功能 - 就是这样.

Kotlin的第二个重要特征 - 它不会进行任何隐式转换,另一方面 - groovy隐式地将double转换为bigdecimal等等.

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

另外我不确定Groovy的类型推理的质量(例如在闭包中我们需要额外的注释,meh),但在Kotlin类型推理工作就像一个魅力,没有任何语言的和平注释.

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