Kotlinのジェネリクスは強力で、型安全性を提供しますが、一部の場面では型情報を再ified(具象化)する必要があります。この記事では、KotlinのReified型パラメータを活用して、型情報を具象化し、便利な方法で使用する方法について説明します。
Reified型パラメータとは?
Reified型パラメータは、Kotlinのインライン関数内でジェネリクス型の型情報を具象化するために使用されます。通常、ジェネリクス型は実行時に型情報が消去されるため、型安全性を保つために明示的に型情報を渡す必要があります。しかし、Reified型パラメータを使用すると、型情報を具象化し、実行時にその情報を利用することができます。
以下は、Reified型パラメータを使用する例です。
inline fun <reified T> printType() {
println(T::class.simpleName)
}
fun main() {
printType<Int>() // 出力: Int
printType<String>() // 出力: String
}
Reified型パラメータの活用法
1. リフレクション
Reified型パラメータは、リフレクション操作で特に便利です。具象化された型情報を持つため、リフレクションを使用して実行時に型を調査できます。
inline fun <reified T> createInstance(): T {
return T::class.java.newInstance()
}
fun main() {
val instance = createInstance<String>()
println(instance) // 出力: ""
}
2. インライン化
Reified型パラメータを使用すると、インライン関数内で型に基づいた特定の処理を行うことができます。これにより、実行時にパフォーマンスの向上が期待できます。
inline fun <reified T> filterItems(items: List<Any>): List<T> {
return items.filterIsInstance<T>()
}
fun main() {
val mixedList: List<Any> = listOf(1, "two", 3.0, "four", 5)
val stringsOnly = filterItems<String>(mixedList)
println(stringsOnly) // 出力: [two, four]
}
3. データベースクエリ
Reified型パラメータを使用して、データベースクエリを型安全に実装できます。クエリの結果を特定の型にキャストする際に便利です。
inline fun <reified T> executeQuery(query: String): List<T> {
// データベースクエリの実行と結果をList<T>として返す処理
}
fun main() {
val results = executeQuery<User>("SELECT * FROM users")
println(results)
}
Reified型パラメータを活用することで、Kotlinのジェネリクスをさらに強力に活用できます。特にリフレクション、インライン化、データベースクエリなどのシナリオで便利です。これにより、型安全性を保ちながら、柔軟で効率的なコードを記述できます。