在Kotlin中无法识别类型参数

时间:2017-10-02 16:16:06

标签: android gson kotlin

使用gson和retrofit并创建了一个JsonDeserializer。

在java中,该类定义为:

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

在Kotlin中,它被定义为:

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

在使用GSON注册后,将按预期调用java类。 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);
}

知道为什么吗?

3 个答案:

答案 0 :(得分: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)
    }

答案 1 :(得分:0)

我使用数组类解决了类似的问题。尝试这样的事情:

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

我希望这可能有所帮助。

答案 2 :(得分:0)

您可以尝试使用此类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);
}