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