我有以下用于扩展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)
{
}
当前如何实现此错误
答案 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中,定义Getter
和Setter
时,您不必自己编写它们。声明变量后,两个方法都会自动创建。
编辑:因此删除POJO类中的吸气剂。