Kotlin M12 言語仕様変更のまとめ
ついにKotlinマイルストーン12がリリースされました! 公式ブログはこちら。 言語仕様の変更についてまとめます。 今回はわりと多いです。
@ngsw_taro 変更多くて修正が大変かと思われますが、Analyze -> Code cleanupでプロジェクト内のKotlinソースファイルすべてに対してdeprecatedなコードを新しい構文に変換してくれますよ
— たろう (@ngsw_taro) May 30, 2015
アノテーション
アノテーションの記法が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
キーワードに取って代わられます。
列挙型
Javaのenumと非常に近くなりました。 つまり、エントリ間はカンマで区切り、メンバを持たせる場合には最後のエントリにセミコロンを置き、エントリの直後にコンストラクタへのパラメータリストを記述できるようになりました。詳細はこちら。
関数型
通常の関数型が要求される場面で、拡張関数を渡せるようになったらしいです。メソッド参照が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
でのbreak
とcontinue
- インタフェースのクラス継承
- スーパタイプの共変特殊化
- 静的型の表明