0Pricing
Kotlin Academy · レッスン

reified型パラメータ:実行時にTへアクセスする

inline関数でreifiedを使い、実行時に型チェックとキャストを行います。

「reified型パラメータ:実行時にTへアクセスする」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

型消去の問題

Kotlin/JVMでは、実行時にジェネリック型情報が消去されます。ジェネリック関数fun foo()の内部では、T::classやis Tと書くことはできません。コンパイル後のJVMにはTが何であるか分からないためです。

reifiedによる解決

型パラメーターにinlineとreifiedを組み合わせます。関数がインライン展開されるため、コンパイラーは各呼び出し箇所で実際の型に置き換えます。これにより、実行時にTへ完全にアクセスできるようになります。

inline fun <reified T> isInstance(value: Any): Boolean = value is T

val result = isInstance<String>("hello")  // true

is T による型チェック

reified がない場合、is T はコンパイル時エラー(「消去された型のインスタンスをチェックできません」)になります。reified を付けると、コンパイラーは呼び出し元で指定された具体的な型を使ってチェックするように書き換えます。

inline fun <reified T> filterByType(list: List<Any>): List<T> =
    list.filterIsInstance<T>()

T から KClass を取得する

T::class を使うと、型パラメーターの KClass を取得できます。これにより、リフレクションを使わない型チェックや、API に渡すクラス参照が可能になります。

inline fun <reified T> className(): String = T::class.simpleName ?: "Unknown"

println(className<Int>())  // "Int"

reified によるパース

よく使われるパターンとして、呼び出し時に対象クラスを自動的に受け取る、型安全な parseJson ヘルパーがあります。

inline fun <reified T> parseJson(json: String): T =
    jacksonObjectMapper().readValue(json, T::class.java)

ViewModel / Service Locator パターン

依存性注入コンテナーでは、Class 引数を渡さなくても正しいインスタンスを返すために、reified がよく使われます。

inline fun <reified T : ViewModel> Fragment.viewModel(): T =
    ViewModelProvider(this)[T::class.java]

Class<T> を使った Java API の呼び出し

多くの Java API では、Class 引数が必要です。reified を使えば、呼び出し側にクラスを明示的に渡させることなく、これらの API を呼び出せます。

inline fun <reified T> Gson.fromJson(json: String): T =
    fromJson(json, T::class.java)

reified と型制約

reified は上限境界と組み合わせることもできます。

inline fun <reified T : Any> create(): T =
    T::class.java.getDeclaredConstructor().newInstance()

制限事項

reified 型パラメーターを使用できるのは inline 関数だけです。クラス、インターフェース、非インライン関数では使用できません。実行時にしか分からない未知の型を使って、reified 関数を呼び出すこともできません。

コンパイラーによる実装方法

コンパイラーは各呼び出し元で、T を実際の型引数に置き換えます。呼び出し元のバイトコードには具体的なクラスへの直接参照が含まれるため、リフレクションは必要ありません。

標準ライブラリの例

reified を使用する標準ライブラリ関数には、filterIsInstance()、emptyArray()、arrayOf()、typeOf() があります。これらが正確に動作するのは、inline + reified だからです。

クイックチェック

reified を使用するには、なぜ関数を inline にする必要があるのでしょうか。

まとめ: reified 型パラメーター

重要なポイント:

  • reified により、型消去を回避して実行時に型パラメーターへアクセスできます
  • 関数は inline である必要があります
  • 関数内で is T、T::class、T::class.java を使用できます
  • 型安全な JSON パース、DI ヘルパー、クラス参照 API を実現できます

よくある質問

「reified型パラメータ:実行時にTへアクセスする」レッスンは無料ですか?

はい。「reified型パラメータ:実行時にTへアクセスする」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。

「reified型パラメータ:実行時にTへアクセスする」で何を学びますか?

inline関数でreifiedを使い、実行時に型チェックとキャストを行います。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Kotlin Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「reified型パラメータ:実行時にTへアクセスする」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. inline関数:ラムダのオーバーヘッドをなくす
  2. noinlineとcrossinline修飾子
  3. reified型パラメータ:実行時にTへアクセスする
  4. 実践的なreifiedパターン:パース、DI、シリアライゼーション
← Kotlin Academyに戻る