ついに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- インタフェースのクラス継承
- スーパタイプの共変特殊化
- 静的型の表明