2017-11-02 20 views
2

GSONでJSONオブジェクトの配列を逆シリアル化しようとしています。だから簡単な呼び出し:Kotlinの配列の型とクラスのリテラル

val arrayOfFoo = gson.fromJson(source, Array<Foo<*>>::class.java>) 

トリックを行う必要があります。しかし、タイプイレーズはFoo < *が実行時に存在しないので、クラスリテラルの左側にクラスリテラルのみが許可されているというエラーが表示されます。まあ、解決策がなければなりませんので:

生憎
val arrayOfFoo = gson.fromJson<Array<Foo<*>>>(source, Array::class.java) 

、今Kotlinコンパイラマジック - プリミティブ配列にラッパー型の配列を回す - 何をすべきかを確認することはできませんと教えてくれる: 「Arrayクラスリテラルが必要ですクラス型です。山括弧で指定してください。 "

しかし、待ってください:これは何秒前に動作しませんでした。今コンパイラを教えてくれるので、

Array<Foo>::class.java 

を使用すると、あまりにも、動作しません:「一つの型引数はFooのために期待されています」。

私は個人的にそれを解決する方法を見ることができません。型指定された配列のクラスリテラルを与えることは不可能ですか?型は型パラメータも期待していますか?

答えて

3

基本的な問題:配列のタイプを指定する必要があります。これは、GsonのTypeTokenを使用して行われます。

私はこれが役に立てば幸い:プリミティブのために、それが単純であることを

val listType = object : TypeToken<Array<String>>() {}.type 

val json = """["1"]""" 
val yourClassList :Array<String> = Gson().fromJson(json, listType) 
print(yourClassList) 

注:Gson().fromJson(json, IntArray::class.java)

+0

Fooがタイプパラメータを期待していない場合、なぜそれが実際に動作するのか説明しないので、私が望んでいたものではありません。しかし、それはdefinitelly私のために働くので、ありがとう。 –

4

あなたは例のいずれか

arrayOf<Foo<*>>()::class.java 
java.lang.reflect.Array.newInstance(Foo::class.java, 0)::class.java 
の1のために、配列インスタンスからの配列クラスを取得することができます
関連する問題