データを json にシリアル化することによって、データベース内のデータのストレージを定義するインターフェースがあるとしましょう。
interface StorageApi {
suspend fun store(key: String, value: Any)
// inline suspend fun <reified T: Any> get(key: String): T // reification is not possible in interfaces since we can't inline them
suspend fun <T: Any> get(key: String, kClass: KClass<T>): T // so I have to stick with some other way, like reflection.
}
そして、メソッドの実装があります:
override suspend fun <T : Any> get(key: String, kClass: KClass<T>): T {
val value = // some query to database
return Klaxon().parse<T>(value) // obviously error by compiler since T goes through type-erasure
}
ここでは、実行時に Type-erasure を通過するため、T を使用できません。私は反射を持っていますが、この目的でそれを使用する方法がわかりません。このKlaxon.parse()
関数は、型を取得するために KClass を受け入れません。
これらをバイパスする方法や、この目的でリフレクションを使用するためのユーティリティを作成する方法、またはその他の可能な回避策はありますか?