Несоответствие классов POJO - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть следующий класс Пользователь , который расширяет класс BaseResponse.Я получаю ошибку несоответствия типов:
Обязательно => 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 голосов
/ 19 ноября 2018

Полный ответ таков: ваш код должен выглядеть так:

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 все свойства имели встроенные автоматически сгенерированные геттеры , и добавив свой собственный, вы получите конфликт между сгенерированным геттером и вы создали вручную ( два метода с одинаковым именем, одна и та же подпись ).

Если вам нужно значение по умолчанию для 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) {}
0 голосов
/ 19 ноября 2018

Вы использовали = вместо : при объявлении api_key (apiKey = String).Это означает, что вы инициализируете api_key с String.Companion Object.

И вам не нужно создавать метод 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)
    }
}
0 голосов
/ 19 ноября 2018

Вы застряли на том, как Java делает вещи.В kotlin при определении Getter и Setter вам не нужно писать их самостоятельно.Как только вы объявите переменную, оба метода будут созданы автоматически.

РЕДАКТИРОВАТЬ : поэтому удалите геттер в своем классе POJO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...