Я работаю над приложением, которое имеет 3 API погоды, и я хочу, чтобы мой пользователь мог выбирать, какой из них следует использовать. Каждый из этих API имеет свой собственный формат данных, поэтому я хотел создать функцию, которая создает надлежащий интерфейс, а затем оборачивает его, поэтому в результате получается что-то общее, чтобы я мог обрабатывать его одинаково для каждого интерфейса.
Итак, мой код выглядит так:
fun create(api: Apis): ApiDataSource = retrofitBuilder
.baseUrl(getBaseUrlFor(api))
.build()
.create(getInterfaceClassFor(api))
.convertWith(interfaceConverter)
}
fun Api1.convertWith(interfaceConverter: InterfaceConverter): CommonWeatherDataEntity = ...
private fun getInterfaceClass(api: Apis): Class<*> = when (api) {
Apis.Api1 -> Api1Interface::class.java
Apis.Api2 -> Api2Interface::class.java
}
Однако строка после .create(...)
подсвечивается красным, а ошибка говорит «Неразрешенная ссылка». Это потому, что творение возвращает Any!
То, что я не понимаю (очевидно, являются обобщениями), почему следующий код работает нормально:
fun Apis.createInterface(retrofitBuilder: Retrofit.Builder) =
retrofitBuilder.baseUrl(getBaseUrlFor(this))
.build()
.create(
when (this) {
Apis.Api1 -> Api1Interface::class.java
Apis.Api2 -> Api2Interface::class.java
}
).convertWith(interfaceConverter)