Функция, получающая класс создаваемого модифицированного интерфейса, вызывает неправильный тип возврата - PullRequest
0 голосов
/ 10 апреля 2019

Я работаю над приложением, которое имеет 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)

1 Ответ

1 голос
/ 10 апреля 2019

Поскольку тип, выведенный для when(...), это не Class<*>, а Class<out X>, где X - это общий супертип Api1Interface и Api2Interface. Так что create возвращает X.

Вы сможете увидеть это, удалив тип возврата для getInterfaceClass и проверив, что показывает IDE.

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