POJO类不匹配

时间:2018-11-19 11:56:39

标签: kotlin

我有以下用于扩展BaseResponse类的类 User 。一世 收到类型不匹配错误:
必需=> String
找到=> String.Companion

返回 apiKey

package com.touchsides.rxjavanetworking.network.model

import com.google.gson.annotations.SerializedName

class User: BaseResponse()
{

    @SerializedName("api_key")
    val apiKey = String

    fun getApiKey(): String
    {
        return  apiKey
    }
}

abstract class BaseResponse(var error: String?=null)
{


}

当前如何实现此错误

3 个答案:

答案 0 :(得分:2)

一个完整的答案是您的代码应如下所示:

class User: BaseResponse()
{
    @SerializedName("api_key")
    lateinit var apiKey: String  // must be set by something before being read
}

abstract class BaseResponse(var error: String?=null) {
}

如果您打算稍后通过反序列化来设置apiKey属性,则不需要默认值;如果没有,那么还应该添加以下默认值。删除getApiKey()方法是因为您在Kotlin中不需要此属性,所有属性都内置automatically generated getters,并且通过添加自己的属性,最终将在生成的吸气剂和手动吸气剂之间产生冲突创建的(两个具有相同名称,相同签名的方法)。

如果您确实需要apiKey的默认值,请继续使用var,以便反序列化可以起作用(如果您打算这样做),并添加默认的空字符串或将其设置为可为空的字符串并将其设置为null

class User: BaseResponse()
{
    @SerializedName("api_key")
    var apiKey: String = ""     // if you want a default regardless, or make it nullable and null
}

abstract class BaseResponse(var error: String?=null) {}

答案 1 :(得分:2)

在声明= :时,您使用了api_key而不是(apiKey = String)。这实际上意味着您正在使用api_key对象初始化String.Companion

并且您无需创建getApiKey()(getter)方法,因为默认情况下,您将具有属性的getter方法。

class User : BaseResponse() {

    @SerializedName("api_key")
    var apiKey: String? = null
        private set

}

abstract class BaseResponse(var error: String? = null)

事实上,您可以为此目的使用data class

data class User(@SerializedName("api_key") val apiKey: String):BaseResponse()

fun main(args: Array<String>) {
    Gson().fromJson<User>("{\"api_key\":\"my api key\"}", User::class.java).let {
        println(it.apiKey)
    }
}

答案 2 :(得分:-1)

您对Java的处理方式感到困惑。在kotlin中,定义GetterSetter时,您不必自己编写它们。声明变量后,两个方法都会自动创建。

编辑:因此删除POJO类中的吸气剂。