書籍「Kotlinイン・アクション」を読んで個人的に疑問に思った点や調べたことについて記載する読書記録です。
書籍の内容については記載しません。
第6章の内容
第6章 型システム
https://book.mynavi.jp/ec/products/detail/id=78137
Kotlinイン・アクション 第6章 型システム
混乱しやすいところ
nullの扱いについては、Kotlinでコードを書いている時にnullが返ってくるのか、無視されるのか混乱することがよくあるので、6章に書いてある内容をまとめてみた。
安全呼び出し演算子(?.)の戻り値
foo?.bar()の戻り値はnullableである。
fooがnullだった場合はbarが実行されないわけではなく、nullが返ってくる。
そのため、エルビス演算子と組み合わせて使うことができる。
val hoge = foo?.bar() ?: "Default value"
安全キャスト(as?)の戻り値
キャストに成功した場合はキャスト後の型のインスタンスが返される。
キャストに失敗した場合はnullが返される。
ClassCastExceptionはスローされない。
let関数
foo?.let{}
fooがnullの場合、let関数のラムダは実行されない。(=nullを返さない)
その他
Javaのthisがnullになることはないが、kotlinのthisはnullになることがある
Javaの場合、thisは特定の型のインスタンスを指定するためnullにはならない。
Kotlinの場合、thisはレシーバを指すためレシーバがnull許容型であればnullになりえる。
プラットフォーム型
Javaとの互換性のために存在している。
Javaコードで明示的に@Nullable、@NonNullがついていない場合はKotlinではプラットフォーム型として扱われる。
例:String!
これはnull非許容型にもnull許容型としても扱えるため、実装者が適切に扱う必要がある。
コンパイラは警告やエラーを出さず、適切に扱われていない場合は実行時に例外が発生する。
コレクション型もプラットフォーム型として扱われる。
この場合はミュータブルからイミュータブルのどちらでも扱えるようになる。