Kotlin POJO类不匹配
我有一个类User,它扩展了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
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
。