2016-03-13 3 views
15

Grootを静的にコンパイルすると、KotlinとGroovyは非常によく似た言語として見えます。 GroovyにKotlinが欠けているのは、nullの安全性とは別に、どの機能ですか?静的にコンパイルされたGroovyでは、どのKotlin機能を使用できませんか?

+0

私は質問を少なく引用して意見を交換しました。 Stack Overflowでまだ受け入れられない場合はお詫び申し上げます。 –

答えて

19

KotlinはJVM言語であり、IMOは機能と簡潔さの点でJavaを改善しようとしていますが、命令型と静的型のままです。 Groovyには、動的になることを決めた以外は同様の概念があります。その結果、多くの言語機能が似ています。ここで

は私が

ダイナミック対静的
  • の承知しているいくつかの違いです:Groovyの動的言語として設計された、と@CompileStaticは、偉大な注釈(私はそれをたくさん使用)しながら、追加されましたので、後で。その機能はちょっと強く感じられ、静的な方法でコードを書くよう強制しません。どこでも使用できません(Spockテストはコンパイルに失敗するなど)。時にはGroovy上でさえそれは今でも毎回奇妙な動的な振る舞いをしているようです。 Kotlinは100%Staticであり、動的ではありません。

他にも多数の機能がありますが、私は参考文献を見ることをお勧めします。 https://kotlinlang.org/docs/reference/

  • データクラス - コピー機能を持つ簡潔な(Scalaではケースクラスのようなビット)
  • ヌル安全性は(ビッグプロである)あなたが言及したチェック
  • アイテムを破壊する能力。 ": - ):T楽しいdoStuff(> TのInt体)" のように定義されたヴァル(名前、年齢)=人
  • 高階関数、。 Groovy Closures IMOよりもはるかに優れています。
  • (Scalaのに非常によく似ている)タイプチェックとスマートキャストがいいです:https://kotlinlang.org/docs/reference/typecasts.html
  • コンパニオンオブジェクト、Scalaはまた、クラスから静的メソッドを削除しようとするのと同じ方法で、Kotlinは同じことをしようとします。
  • 継承を制限する密封されたクラス(Scalaにも同様のものがあります)
  • "Nothing"サブタイプはすべてがスーパータイプです。 (Scalaのもう一つの重要な概念)。あなたはそれがGroovyの以外の他の言語から借りんhttps://kotlinlang.org/docs/reference/control-flow.html

見ることができるように:基本的なパターンマッチングのための式を

  • 。彼らは良い言語を作るためにいくつかの素晴らしい機能を選んでチェリーしようとしました。当然、Groovyには独自性があります。私は、IDEメーカーによって作られている、コンパイラは非常に迅速で、偉大なIDEをサポートしているものをKotlinが持っているといないその逆

    別のプラスワンに焦点を当ててきました。 Groovyのは良いサポートを持っていないと言って、私の現在のプロジェクトはコンパイルするのに長い時間がかかり、およびリファクタリングの方法は、常にあなたが動的にコーディングすることを前提としていません。

    あなたが好きな言語の特徴やGroovy(https://github.com/Kotlin/kotlin-koans)とどのように比較しているかを知るために、Koansを試してみることをお勧めします。

  • +2

    Groovyで見つからないKotlinの他の機能の1つに、パラメータがあります。 '' someMethod( "foo"、10、color:RED、verbose:true) ' –

    +0

    は、マップスプレッドをある程度エミュレートするために使用できますが、標準パラメータと名前付きparamsを組み合わせる方法はありません。 "Kotlinは100%Staticであり、ダイナミックはオプションではありません" Kotlinはタイプ推論を持っています(Golangもあります)ので、Kotlinで動的にプログラムできます。 Kotlinは常にコンパイルされているため、スクリプト言語として使用することはできません。これはGroovyとの主な違いです。 –

    +0

    この場合、 "静的"はコンパイル時に決定/ロックされているコンパイルと型を指しています。例えば。 var s = "hello"; s = 1; Kotlinでコンパイルに失敗します。ダイナミックは、タイプ情報のチェックが実行時に行われることを意味します。 Groovyでこれを行うことができます:def s = "hello"; s = 1; def t = s + 1そしてそれはコンパイル/実行されます。私は、kotlinが静的であるという記述は、それとGroovyの両方が型推論を持っていても、まだ正しいと思います。 Javaには型推論の要素もありますが、静的型付けされた言語です:https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html –

    4

    Kotlin静的型付き言語で設計され、静的型付き言語の優れた型システムとその他の利点を備えています。Groovyは、まず動的に型指定された言語であり、その後は静的にしか使用できません。

    groovyでコンパイルスタティックを有効にすると、構文sugarを持つjavaだけが得られます。反対側では、Kotlinの型システムには、nullable and nonnullableという2種類の参照があるため、NPEの少ないコードを書くことができます。 1つの機能だけを求めているのなら、それだけです。

    Kotlinの2番目の大きな特徴 - 暗黙的な変換は行われません。一方、groovyは暗黙的にdoubleをbigdecimalなどに変換します。

    しかしkotlinあり、多くの他の特徴、smart castsADTdoc)、type-safe builders、ゼロコストの抽象化し、最終的に偉大なIDEのサポートなど。

    また、Groovyの型推論の品質についてはわかりません(例えば、クロージャーではadditional annotations、mehが必要です)。しかし、Kotlin型推論作業では、すべての平和言語で注釈がなく、魅力的です。

    GrootyでKotlin - ファーストクラスの市民に静的に型定義されたコンパイル - そうではありません。

    +0

    Kotlinには型推論(Golangもあります)があります動的な方法でコトリンでプログラムすることができます。 Kotlinは常にコンパイルされているため、スクリプティング、インタープリタ言語として使用することはできません。これはGroovyとの主な違いです。 –

    +0

    Groovyは動的言語なので、型推論は言語コアに組み込まれています。あなたはこれについて知っておくべきです。これは、動的型付き言語定義における暗黙的なものです。 –

    +0

    @MarekMarczakタイプ推論の意味は? Groovyでは、動的な型があり、実行時にのみ型を知る(多くの場合)。また、グルーヴィーでは、 "欠けている"のようなものがあります。 – IRus

    関連する問題