Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
reifiedって何ですか?
Search
usuiat
October 26, 2023
Programming
2
630
reifiedって何ですか?
集まれKotlin好き!Kotlin愛好会 vol.47 @オンライン
https://love-kotlin.connpass.com/event/298008/
usuiat
October 26, 2023
Tweet
Share
More Decks by usuiat
See All by usuiat
タッチイベントの仕組みを理解してジェスチャーを使いこなそう
usuiat
1
610
Google I/O 2024 報告LT会(Androidのオンデバイス生成AI)
usuiat
0
370
Modifier.Nodeに移行してパフォーマンスを比べてみた
usuiat
0
350
Other Decks in Programming
See All in Programming
Beyond the RuboCop Defaults
koic
2
480
色んなオートローダーを覗き見る #phpcon_okinawa
o0h
PRO
5
360
Go製CLIツールGatling Commanderによる負荷試験実施の自動化
okmtz
3
640
API Platform for Laravel
dunglas
1
1.2k
DjangoNinjaで高速なAPI開発を実現する
masaya00
0
420
2024-10-02 dev2next - Application Observability like you've never heard before
jonatan_ivanov
0
120
AWS CDKを用いたセキュアなCI/CDパイプラインの構築 / Build a secure CI/CD pipeline using AWS CDK
seike460
PRO
3
500
NANIMACHI
naokiito
0
930
標準ライブラリの動向とイテレータのパフォーマンス
makki_d
3
180
Modernisation Progressive d’Applications PHP
hhamon
0
160
推しの夫に恋のGPS「ときメーター」#M5Stack #IoT #M5JPTour2024
riyu
0
220
上手に付き合うコンポーネントテスト
quramy
3
1.2k
Featured
See All Featured
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
45
4.9k
Gamification - CAS2011
davidbonilla
80
5k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
A Modern Web Designer's Workflow
chriscoyier
692
190k
10 Git Anti Patterns You Should be Aware of
lemiorhan
653
59k
Mobile First: as difficult as doing things right
swwweet
222
8.8k
Facilitating Awesome Meetings
lara
49
6k
The Pragmatic Product Professional
lauravandoore
31
6.2k
BBQ
matthewcrist
84
9.2k
Side Projects
sachag
452
42k
Designing Experiences People Love
moore
138
23k
Optimising Largest Contentful Paint
csswizardry
31
2.8k
Transcript
reifiedって何ですか? 2023 Oct. 26 @Kotlin愛好会 vol.47 usuiat
自己紹介 Atsushi Usui / うっすぃ~ / usuiat もともと 組み込みソフトエンジニア 2020〜
個人でAndroidアプリやライブラリを開発 2023/9~ Androidアプリエンジニア X/GitHub : usuiat Blog : https://engawapg.net/
reifiedって何ですか? Kotlinのジェネリクスに時々ついているキーワード
そもそも読み方は? DeepL「レファイド」 Google翻訳「レアファイ」 weblio「リーフェイ」 英辞郎「リアファイまたはリーイファイ」 Android Developersの動画では「リーファイド」と 発音していたので、私は「リーファイド」と読むこ とにします。 https://www.youtube.com/watch?v=Xj45hobMI78&t=37s
reify : 具象化する https://ejje.weblio.jp/content/reify
で、reifiedって何ですか? inlineのジェネリクス関数で、 ジェネリクスの型情報にアクセスできるようにするためのキーワード 型情報にアクセスして xの型を判定している
で、reifiedって何ですか? inlineのジェネリクス関数で、 ジェネリクスの型情報にアクセスできるようにするためのキーワード 疑問1 型情報って何? 疑問2 reifiedが無いとどうなる? 疑問3 なぜinline限定?
疑問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
疑問2 reifiedがないとどうなる? ジェネリクスは、コンパイル時に型の不整合が無いかをチェックした後、型の情報が消される。 そのため、型情報にアクセスできない。 コンパイルエラーになる。 疑問2-2 なぜ型情報を消すの?
疑問2ー2 なぜ型情報を消すの? ジェネリクス関数をいろいろな場所でいろいろな型で使いまわすためには、具体的 な型情報を持つことができない。 ジェネリクスが無かった時代の古いJavaとの互換性を保つため (これは詳しくは理解できていません) String Int 特定の型に固定できないので、 型情報を消す
理由1 理由2
疑問3 なぜinline限定? inline関数は、コンパイル時にすべての呼び出し元で展開される。 そのため、呼び出し元で実際に指定されている型でコンパイルできる。 なので、型情報にアクセスできる それぞれの呼び出し元の型に 合わせて展開される
未解決の疑問 inlineであれば、reifiedを明示しなくても型情報にアクセスできるよう にコンパイルしてくれてもいいのでは? (何かご存じの方は教えていただけると嬉しいです)
まとめ 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