Kotlin reifiedキーワード

JVMの仕様により、ジェネリック関数の型情報は通常実行時には失われるが、Kotlinではinlinereifiedを利用することで、実行時にもジェネリック関数の型情報を参照できる。

型の具現化(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キーワードは主に型情報が必要なインライン関数と一緒に使用され、型情報をランタイムに使用する必要があるときに有用である。