第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()
なんかでは記述量が減らないですし、どちらかといえばfindViewById
でlateinit var
な変数に代入するときに便利な気がします。
val x = emptyList<String>() val x: List<String> = emptyList() //こう書ける