在构造函数 Kotlin 中使用泛型作为参数

Using generic as parameter in constructor Kotlin

我正在使用两个具有不同输入类型的构造函数,一个是字符串,另一个是泛型​​。问题是在使用 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"))
                }

您可以在 kotlin 中给出命名参数。也就是说,如果存在两个以上的同名构造函数或函数,我们可以显式地将参数指定为命名的一个。在这里我建议明确提及参数 data

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

目前您的 DataResponse class 代表两种不同的事物。一个是错误消息,另一个是成功时的实际数据。 isSuccess 也是多余的,因为当数据为 non-null 时它总是 true 并且如果 errorMessage 为 non-null.

则总是 false

我会按以下方式更改设计:

sealed class DataResponse

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

class ErrorResponse(val errorMessage: String)

现在您有两个独立的 class,它们都具有相同的超类型 DataResponse。这样你就永远知道你在处理什么。

用法:

when(dataResponse) {
    is SuccessResponse -> TODO("deal with data")
    is ErrorResponse -> TODO("deal with error")
}