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
1.2k
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
Google I/O 2025 報告LT会 Small language models with Google AI Edge
usuiat
0
220
発信から広がった地方エンジニアのキャリア
usuiat
0
46
タッチイベントの仕組みを理解してジェスチャーを使いこなそう
usuiat
1
1.4k
Google I/O 2024 報告LT会(Androidのオンデバイス生成AI)
usuiat
0
780
Modifier.Nodeに移行してパフォーマンスを比べてみた
usuiat
0
480
Other Decks in Programming
See All in Programming
After go func(): Goroutines Through a Beginner’s Eye
97vaibhav
0
410
CSC305 Lecture 04
javiergs
PRO
0
270
理論と実務のギャップを超える
eycjur
0
140
詳しくない分野でのVibe Codingで困ったことと学び/vibe-coding-in-unfamiliar-area
shibayu36
3
5.1k
非同期jobをtransaction内で 呼ぶなよ!絶対に呼ぶなよ!
alstrocrack
0
980
はじめてのDSPy - 言語モデルを『プロンプト』ではなく『プログラミング』するための仕組み
masahiro_nishimi
2
580
スマホから Youtube Shortsを見られないようにする
lemolatoon
27
33k
Cursorハンズオン実践!
eltociear
2
1.1k
Pull-Requestの内容を1クリックで動作確認可能にするワークフロー
natmark
2
520
uniqueパッケージの内部実装を支えるweak pointerの話
magavel
0
1k
AI Agent 時代的開發者生存指南
eddie
3
1.8k
その面倒な作業、「Dart」にやらせませんか? Flutter開発者のための業務効率化
yordgenome03
1
130
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
49
14k
A better future with KSS
kneath
239
18k
Fireside Chat
paigeccino
40
3.7k
Agile that works and the tools we love
rasmusluckow
331
21k
Code Review Best Practice
trishagee
72
19k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.5k
Unsuck your backbone
ammeep
671
58k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.6k
Build your cross-platform service in a week with App Engine
jlugia
232
18k
Mobile First: as difficult as doing things right
swwweet
225
10k
The Pragmatic Product Professional
lauravandoore
36
6.9k
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