我要复制Google's code from their repository of samples实现的Android体系结构组件,并以代码为基础慢慢适应我所想到的应用程序的需求。我已经到达了我正在显示错误的地方,我不明白为什么。这是代码块:
data class ApiSuccessResponse<T>(val responseBody: T) : ApiResponse<T>() {
constructor(body: T) : this (responseBody = body)
}
底层的错误消息是
重载冲突:在com.example.rxe.api.ApiSuccessResponse中定义的公共构造函数ApiSuccessResponse(body:T),在com.example.rxe.api.ApiSuccessResponse中定义的公共构造函数ApiSuccessResponse(responseBody:T)
在这里我称为ApiSuccessResponse
,就像在示例代码中一样:
sealed class ApiResponse<T> {
companion object {
fun <T> create(response: Response<T>): ApiResponse<T> {
return if (response.isSuccessful) {
val responseBody = response.body()
if (responseBody == null || response.code() == 204) {
ApiEmptyResponse()
} else {
ApiSuccessResponse(body = responseBody)
}
} else {
val error = response.errorBody()?.string()
val message = if (error.isNullOrEmpty()) {
response.message()
} else {
error
}
ApiErrorResponse(errorMessage = message ?: "Unknown error")
}
}
}
}
自编写示例以来,某些事情可能已经改变。但是,如果我将变量重命名为body
而不是responseBody
,则相同的错误将突出显示对类ApiSuccessResponse
的调用。
答案 0 :(得分:2)
您似乎不了解constructors在Kotlin中的工作方式。这是您尝试复制的代码:
data class ApiSuccessResponse<T>(
val body: T,
val links: Map<String, String>
) : ApiResponse<T>() {
constructor(body: T, linkHeader: String?) : this(
body = body,
links = linkHeader?.extractLinks() ?: emptyMap()
)
//.... rest of body
}
它有两个构造函数:
ApiSuccessResponse(body: T, links: Map<String, String>)
ApiSuccessResponse(body: T, linkHeader: String?)
(从String
中提取链接映射,并将其作为links
传递给主要对象)。您拥有的是:
ApiSuccessResponse(resposebody: T)
ApiSuccessResponse(body: T)
(它尝试以1:1的方式调用主要构造函数,但由于签名相同而发生冲突)如果不需要辅助构造函数,则应将其完全删除。