Тип параметра методов Dagger2 @Binds должен быть назначен возвращаемому типу с интерфейсом и реализацией - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть класс, который реализует интерфейс java.util.function.Function, который я хотел бы внедрить для использования в другом классе, используя Dagger2:

class MyUsefulClass @Inject constructor() : Function<List<String>, String> {

    override fun apply(lines: List<String>): String {
        // Do stuff 
        return ""
    }
}

Обычно я объявляю объявление @Binds в класс модуля выглядит так:

@Module
interface MyModule {

    @Binds
    fun provideMyUsefulClass(concretion: MyUsefulClass): Function<List<String>, String>
}

Этот подход хорошо мне пригодился для всех других классов, которые есть в моем проекте, которые реализуют этот интерфейс, но в этом одном экземпляре я приветствуется сообщение об ошибке:

@Binds methods' parameter type must be assignable to the return type…

Что забавно, так это то, что изменение типа возвращаемого значения класса и объявления @Binds на Function<MutableList<String>, String> с Function<List<String>, String> работает и все компилируется хорошо.

Что мне здесь не хватает? Сообщение об ошибке явно не соответствует действительности. Есть ли здесь какая-то серьезная ошибка, о которой я не знаю?

1 Ответ

1 голос
/ 20 февраля 2020

Я подозреваю, что это может быть случай "отсутствия" @JvmSuppressWildcards, когда kotlin добавляет немного ? extends String в типе List, что приводит к сбою компилятора кинжала (сообщение об ошибке должно содержать еще несколько подсказок).

Полагаю, вам нужно изменить тип функции на Function<List<@JvmSuppressWildcards String>, String> там, где вы ее используете.

Это известное раздражение, вы можете прочитать более подробно здесь: https://medium.com/@naturalwarren / dagger- kotlin -3b03c8dd6e9b

Я подозреваю, что MutableList не Это не проблема, потому что вы можете как читать, так и записывать строки.

...