Использование generic в качестве параметра в конструкторе Kotlin - PullRequest
2 голосов
/ 29 июня 2019

Я использую два конструктора с разными типами ввода: один в виде строки, а другой в качестве универсального.Проблема в том, что при использовании Kotlin он использует только строковый конструктор и игнорирует общее

class DataResponse<T> {
    var isSuccess: Boolean = false
        private set
    var errorMessage: String? = null
    var data: T? = null

    constructor(success: Boolean, data: T) {
        this.isSuccess = success
        this.data = data
    }

    constructor(success: Boolean, errorMessage: String) {
        this.isSuccess = success
        this.errorMessage = errorMessage
    }
}

использование

    if (apiResponse.code() == 200) {
                    Observable.just(DataResponse<List<ResultDTO>>(true,
 apiResponse.body()?.resultList)) ---> **(error on this line forcing to convert it to string)**
                } else {
                    Observable.just(DataResponse(false, "Something went wrong"))
                }

Ответы [ 2 ]

2 голосов
/ 30 июня 2019

В настоящее время ваш класс DataResponse представляет две разные вещи.Одно - это сообщение об ошибке, а другое - фактические данные в случае успеха.isSuccess также является избыточным, потому что это всегда true, когда данные ненулевые, и всегда false, если errorMessage не нулевое.

Я бы изменил дизайн следующим образом:

sealed class DataResponse

class SuccessResponse<T>(val data: T?)

class ErrorResponse(val errorMessage: String)

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

Использование:

when(dataResponse) {
    is SuccessResponse -> TODO("deal with data")
    is ErrorResponse -> TODO("deal with error")
}
2 голосов
/ 29 июня 2019

Вы можете указать именованные параметры в котлине. То есть, если существует более двух конструкторов или функций с одинаковыми именами, мы можем явно указать параметр как именованный. Здесь для простоты предлагаю упомянуть параметр data.

    if (apiResponse.code() == 200) {
        Observable.just(DataResponse<List<ResultDTO>>(true,data=
        apiResponse.body()?.resultList))
    } else {
        Observable.just(DataResponse(false, "Something went wrong"))
    }
...