【问题标题】:Type argument not recognized in KotlinKotlin 无法识别类型参数
【发布时间】:2017-10-02 16:16:06
【问题描述】:

使用 gson 和改造并创建一个 JsonDeserializer。

在java中,类定义为:

public class Test implements JsonDeserializer<NavigationMenu[]> {...

在Kotlin中,定义为:

class NavigationMenuArrayDeserializer : JsonDeserializer<Array<NavigationMenu>> {...

java 类在 GSON 注册后按预期调用。 Kotlin 类永远不会被调用。

Retrofit jsonClient = new Retrofit
                .Builder()
                .baseUrl(baseUrl)
                .client(okHttpClient)
                .addConverterFactory(getGsonConverter())
                .build();

...

private GsonConverterFactory getGsonConverter() {
    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.setLenient();
    gsonBuilder.registerTypeAdapter(NavigationMenu[].class, new NavigationMenuArrayDeserializer());
    Gson gson = gsonBuilder.create();
    return GsonConverterFactory.create(gson);
}

知道为什么吗?

【问题讨论】:

  • 你注册了吗,就像JavaDoc显示的那样:static.javadoc.io/com.google.code.gson/gson/2.6.2/com/google/…
  • 你能告诉我们你使用这个反序列化器的代码吗?
  • 我很犹豫,因为我工作的公司可能有这方面的问题。我会告诉你这个类永远不会被调用,所以没有任何代码运行。当我将 kotlin 切换到 java 时,它运行良好。这是 kotlin Array 与 java Object[] 中的东西,但我不能肯定地说是什么
  • @Psest328 您提供的代码在这两种情况下都可以正常工作。看看这个简单的 repo github.com/varren/KotlinAndJava(没有 android 部分)你有什么不同?
  • @Psest328 总比悬赏给没有用的答案好!

标签: android gson kotlin


【解决方案1】:

很遗憾,没有任何建议对我有用。我将调用类从 java 转换为 kotlin,因为在 kotlin 中调用 java 类类型在过去对我来说很容易......这就是诀窍。

我最初尝试从 java 类调用 kotlin 数组类仍然不成功,但我能够使配置正常工作,所以我称之为完成。

将 OP 中的配置 java 代码转换为 Kotlin 就可以了:

private val gsonConverter: GsonConverterFactory
    get() {
        val gsonBuilder = GsonBuilder()
        gsonBuilder.setLenient()
        gsonBuilder.registerTypeAdapter(Array<NavigationMenu>::class.java, NavigationMenuArrayDeserializer())
        val gson = gsonBuilder.create()
        return GsonConverterFactory.create(gson)
    }

【讨论】:

  • 刚刚发布了代码。没有魔法,只需执行“转换为 kotlin”即可解决问题
【解决方案2】:

您可以尝试像这样使用TypeToken

private GsonConverterFactory getGsonConverter() {

     val type = object : TypeToken< ArrayList < NavigationMenu >>(){}.getType()

     GsonBuilder gsonBuilder = new GsonBuilder();
     gsonBuilder.setLenient();

     gsonBuilder.registerTypeAdapter(type, new NavigationMenuArrayDeserializer());

     Gson gson = gsonBuilder.create();
     return GsonConverterFactory.create(gson);
}

【讨论】:

    【解决方案3】:

    我使用数组类解决了一个类似的问题。试试这样的:

    val clazz = (Array<NavigationMenu>::class).java
    gson.fromJson(json, clazz)
    

    我希望这可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      相关资源
      最近更新 更多