重载冲突:公共构造函数ApiSuccessResponse <t>(正文:T)

时间:2018-08-28 15:16:18

标签: android kotlin

我要复制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的调用。

1 个答案:

答案 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
}

它有两个构造函数:

  1. 主要构造函数:ApiSuccessResponse(body: T, links: Map<String, String>)
  2. 辅助构造函数:ApiSuccessResponse(body: T, linkHeader: String?)(从String中提取链接映射,并将其作为links传递给主要对象)。

您拥有的是:

  1. 主要构造函数:ApiSuccessResponse(resposebody: T)
  2. 次要构造函数:ApiSuccessResponse(body: T)(它尝试以1:1的方式调用主要构造函数,但由于签名相同而发生冲突)

如果不需要辅助构造函数,则应将其完全删除。