类内的扩展属性:未解决的引用:errorResponse

时间:2019-06-25 09:03:47

标签: kotlin kotlin-extension

在我的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 个答案:

答案 0 :(得分:3)

这是因为errorResponse扩展名仅在TransportService的伴随对象的上下文中可用。

如果扩展功能不需要随播广告的属性或方法,则没有真正的理由将扩展放置在那里。不要害怕污染全球范围。从技术上讲,您只是在Response对象上定义此扩展名。

也就是说,如果您确实需要扩展功能的伴侣对象的上下文(例如,如果扩展属性的主体使用了伴侣的某些方法或属性),则可以通过这种方式在使用站点上手动提供上下文:

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

这不仅限于伴随对象,您只需要提供包含with(instance)扩展名的类实例即可。