Kotlin M10で追加されたreified type parameterがいい感じ
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>()
って書けるの本当ありがたい。