Выбор ответа 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-вызовы были гибче.

Варианты ответа

  1. Dagger не поддерживает Set в параметрах конструктора
  2. Kotlin полностью стирает тип Plugin в сигнатуре
  3. Аннотация включает kapt для этого модуля
  4. В сигнатуре 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 ошибок.

Термины по теме