Конфликтующие перегрузки: открытый конструктор ApiSuccessResponse <T>(тело: T) - PullRequest
0 голосов
/ 28 августа 2018

Я копирую код Google из их репозитория образцов , реализующий Компоненты архитектуры Android, медленно адаптируясь к потребностям приложения, которое я имею в виду, используя код в качестве основы. Я уже достиг той части, где для меня отображается ошибка, и я не могу понять, почему. Это кодовый блок:

data class ApiSuccessResponse<T>(val responseBody: T) : ApiResponse<T>() {
    constructor(body: T) : this (responseBody = body)
}

Основное сообщение об ошибке:

Конфликтующие перегрузки: открытый конструктор ApiSuccessResponse (body: T), определенный в com.example.rxe.api.ApiSuccessResponse, открытый конструктор ApiSuccessResponse (responseBody: T), определенный в com.example.rxe.api.ApiSuccessResponse * 9 *

Здесь я звоню 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 голосов
/ 28 августа 2018

Вы, кажется, не понимаете, как конструкторы работают в 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, но он просто конфликтует из-за идентичной подписи)

Если вам не нужен вторичный конструктор, просто удалите его полностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...