Ошибка Dagger2 в ViewModelFactory при изменении MutableMap на Map

У меня проблема при попытке использовать dagger2 Вот моя ViewModelFactory:

class ViewModelFactory @Inject constructor(
private val viewModels: MutableMap<Class<out ViewModel>, Provider<ViewModel>>) : ViewModelProvider.Factory {

override fun <T : ViewModel?> create(modelClass: Class<T>): T {
    val creator = viewModels[modelClass]
        ?: viewModels.asIterable().firstOrNull {
            modelClass.isAssignableFrom(it.key)
        }?.value ?: throw IllegalArgumentException("$UNKNOWN_MODEL_CLASS $modelClass")
    return try {
        @Suppress("UNCHECKED_CAST")
        creator.get() as T
    } catch (e: Exception) {
        throw RuntimeException(e)
    }
}

}

Когда я меняю viewModels на карту, появляется следующая ошибка:

public abstract interface AppComponent {
            ^
  java.util.Map<java.lang.Class<? extends androidx.lifecycle.ViewModel>,? extends javax.inject.Provider<androidx.lifecycle.ViewModel>> is injected at
      com.example.baseproject.utils.ViewModelFactory(viewModels)
  com.example.baseproject.utils.ViewModelFactory is injected at
      com.example.baseproject.di.ViewModelBuilder.bindViewModelFactory(viewModelFactory)
  androidx.lifecycle.ViewModelProvider.Factory is injected at
      com.example.baseproject.MainActivity.viewModelFactory
  com.example.baseproject.MainActivity is injected at
      dagger.android.AndroidInjector.inject(T) [com.example.baseproject.di.AppComponent → com.example.baseproject.di.ActivityModules_ContributeMainActivity.MainActivitySubcomponent]

Пожалуйста, помогите мне, я не знаю, почему это происходит


person Karl Einstein    schedule 28.05.2020    source источник
comment
stackoverflow.com/a/61599962/12191177   -  person IR42    schedule 28.05.2020


Ответы (1)


Вам не хватает @JvmSuppressWildcards. Вы хотите получить Provider<ViewModel>, а не Provider<? extends ViewModel>, но Kotlin сгенерирует вам Provider<? extends ViewModel> без аннотации.

private val viewModels: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>) : ViewModelProvider.Factory {
person EpicPandaForce    schedule 31.05.2020
comment
Спасибо, когда я добавляю эту аннотацию, я решил эту проблему, но не понимаю, почему мне не нужно добавлять @JvmSuppressWildcards, когда я использую MutableMap - person Karl Einstein; 31.05.2020