reified type paramter = 具象化された型パラメータ
名前が強そう。
目的としてはKotlinでJavaクラス(Classインスタンス)を得るための関数javaClassをもっと楽に使えるようにすることっぽい。
例えば今までは、こういう関数↓を作るには引数としてClassインスタンスを受け取る必要があった。
fun getName(clazz: Class<*>): String = clazz.getSimpleName()
まーこんくらいなら別にいいんだけど、これを使う側がちょっとあれになる。
val name = getName(javaClass<StringBuffer>()) println(name) // => StringBuffer
getName(javaClass<StringBuffer>())ってのがダサい。
getName<StringBuffer>()というコードが書けたらイカす。
ということでreified type parameterがこれを実現してくれる!
こんな感じで使います。
inline fun getName<reified T>(): String = javaClass<T>().getSimpleName()
型変数の宣言のところにreifiedというキーワードを置く。
さらにreifiedがある関数は必ずinline指定しなければならない。
val name = getName<StringBuffer>() println(name) // => StringBuffer
うん、便利だ!
Classを使う場面って普段はあまりないけどフレームワークとか作ってると使いたくなることが多い。
以前ちょこっとだけ作ったKotlinでDIしてくれるやつに、このreified type parameterの仕組みを取り入れた。
今までinjector.getInstance(javaClass<HelloWorld>())と書いていたのをinjector.getInstance<HelloWorld>()って書けるの本当ありがたい。