今日書いた
についてですが、原因がわかりました。まずは以下のコードを見てください
Welcome to Kotlin version 1.0.0 (JRE 1.8.0_91-b14) Type :help for help, :quit for quit >>> val a: () -> Int = { 2 } >>> val b: () -> Unit = { 2 } >>> println(a()) 2 >>> println(b()) kotlin.Unit
変数a
とb
の右辺は共に{ 2 }
になっており、これは0引数の無名関数を表しています。一方、a
の型は引数なしでInt
を返す関数、b
の型は引数なしでUnit
を返す関数となっており、型に互換性がないにも関わらず、代入することができています。
このことから、無名関数の式の型は、期待される型によって(も)決定されるのだろうということがわかります。具体的には、2行目の{ 2 }
の型は期待される型が() -> Unit
なので、{ 2 }
自体が() -> Unit
型になり、そこから、
{ -> 2; Unit }
のようにUnitが補われているのだろうと思います。
F.kt:3:25: warning: the expression is unused val b: () -> Unit = { 2 } ^
という警告が出る辺りもそれを裏付けていると言えそうです。