縁あって@kmizuこと水島宏太さんに社内の技術推進活動の支援をいただいています。
その活動のひとつとして勉強会を開催したのでご紹介します。 コロナ禍の影響でオンライン勉強会です!

水島さんの経験や得意分野を踏まえ、弊社社員からテーマをリクエストさせていただき、アカデミックな話題も混ぜつつ、時にはマニアックな内容も盛り込んでもらっています。

ブログでは紹介できていませんでしたが、昨年より勉強会を開催してきました。

  • ガベージコレクションの基礎と歴史
  • 基礎の学び方
  • コンピュータサイエンスって何だろう?
  • Scala教育悲喜こもごも
  • Javaのジェネリクスを知ろう

この記事では、先週開催された「Javaのジェネリクスを知ろう」の勉強会レポをご紹介します。

Javaのジェネリクスを知ろう

この発表テーマをお願いする時に、実は他にもラムダの話を聞きたいというリクエストがありましたが、ラムダはジェネリクスを理解していることがキーポイントになるため、先にジェネリクスに絞ってお話をしていただくことに。内容はJavaを学び始めた新卒者に役立つような内容でありつつ、ベテラン向けにマニアックな話も入れて欲しいという、やや無茶なお願いをしました。それをうまく落としこんで私たちが聞きたい内容に仕上げてくださいました。ありがとうございます!

発表はJava 1.4までジェネリクスがなかった時代背景から話が始まり、Object型を使うとダウンキャストが必要となり安全性に問題があることをコード例を添えて解説。その後にジェネリクスが導入されるきっかけや歴史に触れて、概要や機能の話をしてくださいました。

発表時間は1時間弱で基本的なところがしっかり押さえられており、初学者でもわかりやすい内容だったと思います。その中でも私が興味深く感じたのは以下の話題でした。

  • 型パラメータの上限境界
  • ワイルドカード

ジェネリクスの機能の一つであるワイルドカードは、リリースされてだいぶ時間が経ってから、安全性の面で問題あることがわかったそうです。OOPSLA2016で公開された Java and scala's type systems are unsound: the existential crisis of null pointers という論文を引用しつつ、自身の考えを述べてくださいました。

危険視すべき問題なのかというと、水島さんの考えではそうではなく、「ワイルドカード単体では発生する問題ではないので、一概にワイルドカードが駄目だという話ではない」ということでした。nullや上限・下限ワイルドカードと組み合わせた時に発生するというもので、nullとワイルドカードという機能の組み合わせによって、安全性上の問題が発生してしまったよと。ユースケースなどの多面性や言語仕様として取り入れられた経緯を追いながら、なぜこの機能は存在しているのか、何がヤバいのかというのがわかって話を聞いていて面白かったです。

コーナーケースなので知らなくても実務では困ることは少ないかもしれないけど、知ったうえでJava APIやフレームワークのコードを読むと、見えてくる世界も違うかもしれませんね。

他のベテラン層の参加者に参加した感想を聞いてみたら「ワイルドカードの元になった理論を発明したのが日本人だって知らなかったし、他の言語でのジェネリクスの話が個人的によかったです。ScalaとKotlinが激似とか、Goでの話など。」と言っていて、新しい発見や新鮮さを楽しめたようです。

2020年にジェネリクスを取り上げていただいたわけですが、時が経ったからわかった事もあり「今だから言える事だけど実はワイルドカードは必要なかったかもね……」というような話ができるのも、今だからできる話題ですね。

たのしかったです。