Выбор ответа Senior Java-интероп обновлено
@JvmSuppressWildcards и Dagger
Вопрос
Почему Hilt/Dagger иногда не находит Set<Plugin> при внедрении в Kotlin-конструктор и помогает Set<@JvmSuppressWildcards Plugin>?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: В сигнатуре Set<? extends Plugin, а Dagger ищет Set<Plugin. Для параметров с ковариантными типами (Set<out E, List<out E) Kotlin генерирует в Java-сигнатуре wildcard ? extends Plugin, чтобы Java-вызовы были гибче.
Варианты ответа
- Dagger не поддерживает
Setв параметрах конструктора - Kotlin полностью стирает тип
Pluginв сигнатуре - Аннотация включает kapt для этого модуля
- В сигнатуре
Set<? extends Plugin>, а Dagger ищетSet<Plugin>правильный ответ
Разбор
Для параметров с ковариантными типами (Set<out E>, List<out E>) Kotlin генерирует в Java-сигнатуре wildcard ? extends Plugin, чтобы Java-вызовы были гибче. Dagger сопоставляет типы буквально и не видит связь с multibinding Set<Plugin>. @JvmSuppressWildcards отключает генерацию wildcard. Множества Dagger поддерживает, тип не стирается полностью, kapt тут ни при чём.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.