我试图用GSON反序列化一组JSON对象。所以简单的电话:
val arrayOfFoo = gson.fromJson(source, Array<Foo<*>>::class.java>)
应该做的伎俩。但是类型擦除告诉我们,Foo&lt; *&gt;在运行时不存在,因此弹出错误“只允许在类文字左侧允许类文字”。那么,解决方案必须是:
val arrayOfFoo = gson.fromJson<Array<Foo<*>>>(source, Array::class.java)
不幸的是,现在Kotlin编译器魔术 - 将Wrapper类型的数组转换为原始数组 - 无法确定该怎么做并告诉我们: “数组类文字需要类类型。请在尖括号中指定一个”。
但是,等等:这是,一秒钟前没用的东西。使用
Array<Foo>::class.java
也不起作用,因为现在编译器告诉我们:“Foo需要一个类型的参数”。
我个人无法找到解决这个问题的方法。是否不可能给出类型数组的类文字,类型也需要类型参数?
答案 0 :(得分:4)
您可以从数组实例中获取数组类,例如
中的任何一个arrayOf<Foo<*>>()::class.java
java.lang.reflect.Array.newInstance(Foo::class.java, 0)::class.java
答案 1 :(得分: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)