Kotlin POJO类不匹配

Kotlin POJO类不匹配,kotlin,Kotlin,我有一个类User,它扩展了BaseResponse类。我 我收到一个类型不匹配错误: 必需=>字符串 已找到=>字符串。同伴 用于返回apiKey package com.touchsides.rxjavanetworking.network.model import com.google.gson.annotations.SerializedName class User: BaseResponse() { @SerializedName("api_key") val

我有一个类User,它扩展了
BaseResponse
类。我 我收到一个类型不匹配错误:
必需=>
字符串

已找到=>
字符串。同伴

用于返回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)
{


}

这个错误的当前实现是怎样的

您被Java的工作方式所困扰。在kotlin中,当定义
Getter
Setter
时,您不必自己编写它们。一旦您声明了一个变量,这两个方法都将自动创建


编辑:因此删除POJO类中的getter。

您被Java的工作方式所束缚。在kotlin中,当定义
Getter
Setter
时,您不必自己编写它们。一旦您声明了一个变量,这两个方法都将自动创建


编辑:因此删除POJO类中的getter。

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

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中不需要该方法,所有属性都是内置的,如果添加自己的属性,则生成的getter与手动创建的getter(两个具有相同名称、相同签名的方法)之间会发生冲突

如果您确实需要
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) {}

完整的答案是,您的代码应该如下所示:

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中不需要该方法,所有属性都是内置的,如果添加自己的属性,则生成的getter与手动创建的getter(两个具有相同名称、相同签名的方法)之间会发生冲突

如果您确实需要
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) {}

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

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

class User : BaseResponse() {

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

}

abstract class BaseResponse(var error: String? = null)
实际上,您可以为此目的使用
数据类

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)
    }
}
数据类用户(@SerializedName(“api_key”)val-apiKey:String):BaseResponse()
趣味主线(args:Array){
Gson(){
println(it.apiKey)
}
}

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

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

class User : BaseResponse() {

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

}

abstract class BaseResponse(var error: String? = null)
实际上,您可以为此目的使用
数据类

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)
    }
}
数据类用户(@SerializedName(“api_key”)val-apiKey:String):BaseResponse()
趣味主线(args:Array){
Gson(){
println(it.apiKey)
}
}

@Jayson Minard你错了。我在我的一个项目中使用了它,效果很好。再想一想,解释为什么它对OP不起作用。这取决于反序列化的工作方式,如果它使用反射并捕获字段,并且在没有经过setter的情况下做了一些危险的事情,那么它可能会在其中填充一个值。许多反序列化程序不会这样做,他们会将其视为只读,而不会对其进行设置。科特林特定的人肯定不会。序列化可以很好地工作,这正朝着另一个方向发展。因此,您可以依靠一些Java代码进行反射填充的运气,也可以使用
lateinit var apiKey:String
,并使用用于此特定用例的机制。@Jayson Minard您错了。我在我的一个项目中使用了它,效果很好。再想一想,解释为什么它对OP不起作用。这取决于反序列化的工作方式,如果它使用反射并捕获字段,并且在没有经过setter的情况下做了一些危险的事情,那么它可能会在其中填充一个值。许多反序列化程序不会这样做,他们会将其视为只读,而不会对其进行设置。科特林特定的人肯定不会。序列化可以很好地工作,这正朝着另一个方向发展。因此,您可以依靠一些Java代码进行反射填充的运气,或者,您可以将其设置为
lateinit var apiKey:String
,并使用用于此特定用例的机制。简单键入
val apiKey=String
的意思是
val apiKey:String
。简单键入
val apiKey=String
的意思是
val apiKey:String