Java読書会BOF「Kotlinイン・アクション」を読む会 第4回

開催概要
日時 2018年4月21日 10:00 - 17:00
場所 川崎市教育文化会館 第3会議室
出席者(敬称略) 常念、平山、吉本、井上、加藤、遠藤、藪下、岩室、高橋(智)、高橋(徹)

第5章 ラムダを使ったプログラミング

5.4.2 SAM変換:ラムダの関数型インターフェイスへの明示的な変換

5.5.1 with関数

5.5.2 apply関数

5.6 まとめ

  • withを導入している言語はほかにある?
    • Object Pascal/Delphi、VBA、JavaScript
      • 他の言語では、曖昧さ、バグの元なので推奨されないことが多い
      • Kotlinの仕様ならば曖昧さはなさそう
  • 標準関数はどうやって調べるの?
    • 一つの方法としてIDE(IntelliJ IDEA等)で宣言にジャンプする
      • with関数はStandard.ktに記述されている
      • その方法だとコードを書かないと調べられない
    • (議事録作成時追記)Kotlin標準ライブラリのリファレンスが次のURLで公開されている

第6章 Kotlinの型システム

6.1.5 安全キャスト: as?

  • リスト6.6(次のコード片)で、エルビス演算子に return が書ける! (returnは式?)
val otherPerson = o as? Person ?: return false

6.1.6 非null表明: !!

  • 【誤植】 p.188 下4 「isEnableよりも複雑になった場合」→「isEnableよりも複雑になった場合」

6.1.7

  • let関数は、?.で呼び出している
    • レシーバがnull許容型だと?.で呼ばないとコンパイルエラー
    • P.181の図6.2では、安全呼び出し演算子は、レシーバがnullのときnullが使用されるとあるが、図6.6では、fooがnullのとき「何も起きない」とある。letのときは特殊な処理がある?
    • nullとなる。図の書き方に齟齬があるだけでは。

6.1.11 null許容性の区別とJava

  • 宿題
    • プラットフォーム型をnull非許容型変数へ代入するコードをバイトコート上で調べ、どのようなnullチェックが入るか確認する。
    • (議事録執筆時追記)Javaから呼ばれるKotlinのクラスのメソッドで次のコードが生成されていた。
invokestatic #15  // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
  • p.201 nullを許容しないというアサーションを生成するとあるが、Javaの言語仕様のassertか、一般的な意味のアサーション(表明)かどちらだろう? 上の宿題で確認できるかと。
    • (議事録執筆時追記)上述のとおり、assertではなく、kotlin.jvm.internal.IntrinsicsクラスのcheckParameterIsNotNullメソッドが呼ばれていた。このメソッドは引数がnullか判定し、nullなら例外をスローしている。

6.2.3 数値の変換

  • Kotlinの数値型はJavaのプリミティブ型の名前の先頭を大文字にしたネーミングになっている。
  • 【誤植】 p.206 2行目 「42.0L」→「42.0F」
  • JavaではHexadecimal floating point Literals があるけどKotlinではどうだろう?
    • コンパイルエラーとなった。

6.3.3 KotlinのコレクションとJava

  • 【誤植】 p.217 表6.1 一番下の行 「masOf」→「mapOf」
  • 図6.13 でArrayListはMutableList(インターフェイス)を実装しているが、Javaのクラスでは実装していないはず、どうなっているのかな?
    • KotlinのArrayList型はJavaのArrayList型にタイプエイリアスされているから大丈夫なはず
    • インターフェイス(MutableListとか)のマッピングもあるのではないか?

本日は、p. 242 7.3.3の手前まで