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