1. ホーム
  2. generics

[解決済み] KotlinでGsonを使ったTypeToken + ジェネリックの使い方

2022-06-12 13:51:53

質問

カスタムクラス(Turns)からジェネリックタイプのListを取得することができないのですが。

val turnsType = TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson(pref.turns, turnsType)

と書いてあった。

cannot access '<init>' it is 'public /*package*/' in 'TypeToken'

どのように解決するのですか?

このインラインファンを作成します。

inline fun <reified T> Gson.fromJson(json: String) = fromJson<T>(json, object: TypeToken<T>() {}.type)

という具合に呼び出すことができます。

val turns = Gson().fromJson<Turns>(pref.turns)
// or
val turns: Turns = Gson().fromJson(pref.turns)

以前の代替品

代替案1:

val turnsType = object : TypeToken<List<Turns>>() {}.type
val turns = Gson().fromJson<List<Turns>>(pref.turns, turnsType)

には object : で、具体的な型は fromJson<List<Turns>>


代替案 2:

cypressiousさんがおっしゃるように、この方法でも実現可能です。

inline fun <reified T> genericType() = object: TypeToken<T>() {}.type

として使う。

val turnsType = genericType<List<Turns>>()