Kotlinの謎(解明編)
今日書いた
についてですが、原因がわかりました。まずは以下のコードを見てください
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 }
^
という警告が出る辺りもそれを裏付けていると言えそうです。