【问题标题】:Kotlin array types and class literalsKotlin 数组类型和类文字
【发布时间】:2017-11-02 21:22:21
【问题描述】:

我正在尝试使用 GSON 反序列化 JSON 对象数组。所以简单的调用:

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

应该可以解决问题。但是类型擦除告诉我们, Foo 在运行时不存在,因此会弹出错误“仅允许在类文字的左侧使用类文字”。好吧,所以解决方案必须是:

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

不幸的是,现在 Kotlin 编译器魔法 - 将 Wrapper 类型的数组转换为原始数组 - 无法确定该怎么做并告诉我们: “数组类文字需要类类型。请在尖括号中指定一个”。

但是,等等:这是,一秒钟前没有用的东西。使用

Array<Foo>::class.java

也不起作用,因为现在编译器告诉我们:“Foo 需要一个类型参数”。

我个人无法找到解决该问题的方法。是否不可能给出类型化数组的类字面量,它的类型也需要类型参数?

【问题讨论】:

    标签: arrays generics kotlin


    【解决方案1】:

    您可以从数组实例中获取数组类,例如任一

    arrayOf<Foo<*>>()::class.java
    java.lang.reflect.Array.newInstance(Foo::class.java, 0)::class.java
    

    【讨论】:

      【解决方案2】:

      基本问题:您需要指定数组的类型。这是在 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)

      【讨论】:

      • 好吧,这不是我所希望的,因为它没有解释为什么它确实有效,如果 Foo 不需要类型参数。但它肯定对我有用,所以谢谢。
      猜你喜欢
      • 2016-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-25
      • 2021-12-18
      相关资源
      最近更新 更多