アンセケターメンはてなエディション

いつどこで誰に見られても恥ずかしいコードが置かれています

C#erのKotlin/Android入門記 #2 変数宣言

第2回は変数宣言や代入についてです。

Kotlinは型推論をバリバリ使っています。また、C#と逆で型情報は変数名の後ろが定位置です。

変数宣言

変数は var 変数名 = 初期値 と書きます。これだけ見るとC#と変わりませんね。

var x = 3 //Intと推論
var y: Int = 3 //Intと明示もできる

var z: Long = 3 //明示的にLongなどにしたい場合は型を書くか
var w = 3L //末尾にLをつける

var x: Int //変数は初期化必須(デフォルト値の代入はない)
println(x) //コンパイルエラー

型推論メインで型情報があまり書かれないためか別の理由があるのか、数値の暗黙的キャストは行われません。

var a = 5 //Int
var b: Long = a //エラー:IntからLongへ暗黙的キャストは行われない
var b = a.toLong() //明示的にキャストが必要

ただし、クラスやインターフェースのキャストは暗黙的に行うことができます。

読み取り専用変数宣言

valキーワードを使うことで、初期化時以外は再代入不可能な変数を宣言することができます。

val x = 3
x += 1 //再代入できないのでコンパイルエラー

また、Androidのアクティビティなどではクラスの初期化時にはビューの要素にアクセスできないため、lateinit varキーワードで「すまんちょっと初期化は後回しにさせてもらうからvarだけど再代入はやめといてくれ」という意思を表明することができます。
なお、lateinitは初期化時にnullをとりあえず入れておくコードが生成されるので値型は使えません。0でも入れときゃいいんじゃないでしょうか。

lateinit var button: Button

override fun onCreate() {
  //onCreate内などで初期化
  button = findViewById(R.id.button)
}

その他

型推論ジェネリクスにも効いていて、emptyList<T>のようなジェネリクスを用いた関数のを省略することができます。
まあemptyList()なんかでは記述量が減らないですし、どちらかといえばfindViewByIdlateinit varな変数に代入するときに便利な気がします。

val x = emptyList<String>()
val x: List<String> = emptyList() //こう書ける