Свойство расширения внутри класса: неразрешенная ссылка: errorResponse - PullRequest
1 голос
/ 25 июня 2019

В моем проекте Android:

// Extension Properties
val Response<*>.errorResponse: ErrorResponse
    get() = ErrorUtils.parseError(this)

class TransportService {
    companion object {
        private val SERVICE_UNAVAILABLE_CODE = 503
        private val traderMonitorRestClient = RestClientFactory.createRestClient(TraderMonitorRestClient::class.java)
        private val serviceUnavailableErrorResponse: Response<*>


}

и здесь используется свойство расширения

class TradersViewModel(application: Application) : AndroidViewModel(application) {

  val errorResponse = response.errorResponse

}

приятно, что это работает,

Но если я перееду errorResponse внутри класса:

class TransportService {
    companion object {
        private val SERVICE_UNAVAILABLE_CODE = 503
        private val traderMonitorRestClient = RestClientFactory.createRestClient(TraderMonitorRestClient::class.java)
        private val serviceUnavailableErrorResponse: Response<*>

        private val TAG = TransportService::class.java.name

        val Response<*>.errorResponse: ErrorResponse
            get() = ErrorUtils.parseError(this)
    }
}

тогда я получаю ошибку компиляции в месте использования:

val errorResponse = response.errorResponse

ошибка:

Unresolved reference: errorResponse

1 Ответ

3 голосов
/ 25 июня 2019

Это потому, что расширение errorResponse доступно только в контексте объекта-компаньона TransportService, когда вы его там определяете.

Если вашей функции расширения не нужны свойства или методы компаньона, нет никакой реальной причины помещать расширение туда.Не бойтесь загрязнять глобальный охват.Технически, вы определяете это расширение только для вашего Response объекта.

При этом, если вам действительно нужен контекст сопутствующего объекта для вашей функции расширения (например, если тело вашего свойства расширения использует некоторые методыили свойств сопутствующего), вы можете вручную предоставить контекст на сайте использования следующим образом:

val errorResponse = with(TransportService.Companion) { response.errorResponse }

Это не ограничивается сопутствующими объектами, вам просто нужно предоставить экземпляр класса, который содержитрасширение до with(instance).

...