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

时间:2019-06-29 19:08:57

标签: android generics kotlin kotlin-android-extensions constructor-overloading

我使用两个具有不同输入类型的构造函数,一个作为字符串,另一个作为通用。问题是在使用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 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

当前,您的DataResponse类代表两种不同的事物。一种是错误消息,另一种是成功的情况下的实际数据。 isSuccess也是多余的,因为当数据为非空时,它总是true;如果errorMessage为非空,它总是false

我将通过以下方式更改设计:

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")
}