在我的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
答案 0 :(得分:3)
这是因为errorResponse
扩展名仅在TransportService
的伴随对象的上下文中可用。
如果扩展功能不需要随播广告的属性或方法,则没有真正的理由将扩展放置在那里。不要害怕污染全球范围。从技术上讲,您只是在Response
对象上定义此扩展名。
也就是说,如果您确实需要扩展功能的伴侣对象的上下文(例如,如果扩展属性的主体使用了伴侣的某些方法或属性),则可以通过这种方式在使用站点上手动提供上下文:
val errorResponse = with(TransportService.Companion) { response.errorResponse }
这不仅限于伴随对象,您只需要提供包含with(instance)
扩展名的类实例即可。