Slide 1

Slide 1 text

reifiedって何ですか? 2023 Oct. 26 @Kotlin愛好会 vol.47 usuiat

Slide 2

Slide 2 text

自己紹介 Atsushi Usui / うっすぃ~ / usuiat もともと 組み込みソフトエンジニア 2020〜 個人でAndroidアプリやライブラリを開発 2023/9~ Androidアプリエンジニア X/GitHub : usuiat Blog : https://engawapg.net/

Slide 3

Slide 3 text

reifiedって何ですか? Kotlinのジェネリクスに時々ついているキーワード

Slide 4

Slide 4 text

そもそも読み方は? DeepL「レファイド」 Google翻訳「レアファイ」 weblio「リーフェイ」 英辞郎「リアファイまたはリーイファイ」 Android Developersの動画では「リーファイド」と 発音していたので、私は「リーファイド」と読むこ とにします。 https://www.youtube.com/watch?v=Xj45hobMI78&t=37s reify : 具象化する https://ejje.weblio.jp/content/reify

Slide 5

Slide 5 text

で、reifiedって何ですか? inlineのジェネリクス関数で、 ジェネリクスの型情報にアクセスできるようにするためのキーワード 型情報にアクセスして xの型を判定している

Slide 6

Slide 6 text

で、reifiedって何ですか? inlineのジェネリクス関数で、 ジェネリクスの型情報にアクセスできるようにするためのキーワード 疑問1 型情報って何? 疑問2 reifiedが無いとどうなる? 疑問3 なぜinline限定?

Slide 7

Slide 7 text

疑問1 型情報って何? ジェネリクスが実行時に何の型(クラス)で動作しているか、の情報。  KClassが持つ情報  クラス名(.simpleName)、メンバー(.members)など  .java経由でJavaのClassにもアクセス可能  クラスに基づく処理  isによる型判定  asによるキャスト 型情報にアクセスできるので、 型が一致しているかを判定できる KClass https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.reflect/-k-class/ Class https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html

Slide 8

Slide 8 text

疑問2 reifiedがないとどうなる? ジェネリクスは、コンパイル時に型の不整合が無いかをチェックした後、型の情報が消される。 そのため、型情報にアクセスできない。 コンパイルエラーになる。 疑問2-2 なぜ型情報を消すの?

Slide 9

Slide 9 text

疑問2ー2 なぜ型情報を消すの? ジェネリクス関数をいろいろな場所でいろいろな型で使いまわすためには、具体的 な型情報を持つことができない。 ジェネリクスが無かった時代の古いJavaとの互換性を保つため (これは詳しくは理解できていません) String Int 特定の型に固定できないので、 型情報を消す 理由1 理由2

Slide 10

Slide 10 text

疑問3 なぜinline限定? inline関数は、コンパイル時にすべての呼び出し元で展開される。 そのため、呼び出し元で実際に指定されている型でコンパイルできる。 なので、型情報にアクセスできる それぞれの呼び出し元の型に 合わせて展開される

Slide 11

Slide 11 text

未解決の疑問  inlineであれば、reifiedを明示しなくても型情報にアクセスできるよう にコンパイルしてくれてもいいのでは? (何かご存じの方は教えていただけると嬉しいです)

Slide 12

Slide 12 text

まとめ reified(リーファイド)は、inlineのジェネリクス関数で型情報にアクセスできるように するためのキーワード reifiedをつけることによって、ジェネリクスの型を判定したり、指定した型のオブ ジェクトを返したりできる 参考 Reified - Kotlin Vocabulary https://www.youtube.com/watch?v=Xj45hobMI78 Reified type parameters https://kotlinlang.org/docs/inline-functions.html#reified-type-parameters ジェネリクス: reified でジェネリクスの型情報を維持する – まくまくKotlinノート https://maku77.github.io/kotlin/generics/reified.html