算譜王におれはなる!!!!

偏りはあると思うけど情報技術全般についてマイペースに書くよ。

Kotlin M12 言語仕様変更のまとめ

ついにKotlinマイルストーン12がリリースされました! 公式ブログはこちら。 言語仕様の変更についてまとめます。 今回はわりと多いです。

アノテーション

アノテーションの記法がJavaっぽくなりました。 つまりM12より前では[Foo(args)]と書いていたものを、M12以降では@Foo(args)と書くことになります。 今まで通り@を付けずに済むこともあります。

ラベル

このアノテーションの変更に伴い、ラベルの書き方も変わります。 今までは@nameだったものをname@@を最後に持ってくる必要があります。

loop@ for (i in 1..100) {
  for (j in 1..100) {
    if (...)
      break@loop
  }
}

アノテーションでKClassが使えるようになった

アノテーションの引数として受け取るクラス参照が、M12より前だとjava.lang.Class限定でした。 そのため引数を渡す側のコードはjavaClass<MyClass>()のようなちょっとイケてない記述になっていました。 M12からはjava.lang.Classの代わりにkotlin.refrect.KClassが使えるようになります。

プライマリコンストラクタ

今までプライマリコンストラクタclass User(val id: Long)のように記述していました。 M12でもこの記法は有効ですが、full formで記述するとclass User constructor(val id: Long)になります。 このfull formは、プライマリコンストラクタに対してアノテーションや修飾子を付けるときに使用することになります。

インタフェース

traitキーワードは非推奨となり、interfaceキーワードに取って代わられます。

列挙型

Javaenumと非常に近くなりました。 つまり、エントリ間はカンマで区切り、メンバを持たせる場合には最後のエントリにセミコロンを置き、エントリの直後にコンストラクタへのパラメータリストを記述できるようになりました。詳細はこちら

関数型

通常の関数型が要求される場面で、拡張関数を渡せるようになったらしいです。メソッド参照がJavaのそれと同じような感じになったということです。具体的には(String) -> Intが要求される箇所でString::lengthのようなString.() -> Int型の関数参照を渡せます。

// M12より前はこう書いてた
strs.map { it.length() }

// M12からはこう書ける (M12より前は型エラーになってた)
strs.map(String::length)

KotlinでJavaみたいなメソッド参照をする - 算譜王におれはなる!!!!で面白い(けど複雑な)アプローチを考えていたのでこの改善は嬉しいです!

スマートキャスト

スマートキャスト(nullチェック含む)がより賢くなりました。 varな変数に対してもコンパイラが追える範囲で、スマートキャストが有効になります。

名前付きリターン

高階関数の引数として直接記述する関数式内での名前付きリターンがサポートされたようです(M11でもされてたような?)。 関数式はfun(arg)=...のように書く関数リテラルみたいなやつのことです。

削除された機能と非推奨になった機能

削除

  • class object。代わりにcompanion objectを使いましょう。
  • 匿名イニシャライザ。initを付けたブロックを使いましょう。

非推奨

  • whenでのbreakcontinue
  • インタフェースのクラス継承
  • スーパタイプの共変特殊化
  • 静的型の表明