Kotlin reifiedキーワード
JVMの仕様により、ジェネリック関数の型情報は通常実行時には失われるが、Kotlinでは
inlineとreifiedを利用することで、実行時にもジェネリック関数の型情報を参照できる。型の具現化(reified)
Kotlinでreifiedは、通常inline関数と一緒に使用される特別な型パラメータである。
JVMの仕様により、一般的にジェネリック型パラメータはランタイムに消去される。これはJavaの型消去に関係している。つまり、ジェネリック型が実際にどの型なのかという情報は、ランタイムでは使用できない。しかしKotlinのreifiedキーワードを使うと、この制約を回避できる。つまり、実行時にもジェネリック関数の型情報を参照できる。
reifiedキーワードは、inline関数内でジェネリック型パラメータを実際に認識できるようにする。そのため、inline関数内でジェネリック型に関するランタイム情報を使用できる。
たとえば、次はreifiedキーワードを使用してジェネリック型を実際に判別し、その型に対するランタイム検査を行う簡単な例である。
inline fun <reified T> exampleFunction(item: T) {
if (item is String) {
println("It's a String!")
} else {
println("It's not a String!")
}
}
fun main() {
exampleFunction("Hello") // Output: It's a String!
exampleFunction(5) // Output: It's not a String!
}
上の例でexampleFunctionはジェネリック型Tを持ち、reifiedキーワードで示されている。これにより、関数内でTに関するランタイム情報を使用できる。そのため、item is Stringのようなランタイム型検査を実行できる。
reifiedキーワードは主に型情報が必要なインライン関数と一緒に使用され、型情報をランタイムに使用する必要があるときに有用である。