Dagger 2 con Kotlin, regresando el tipo con generic en ApplicationComponent

Quiero devolver el tipo con genérico para ser expuesto por sub-charts, el problema está en auto-generar classs de Java, traté de hacer algo, pero la única forma de resolverlo es eliminar el tipo genérico de AppComponent y devolver el object simple . ¿Hay un enfoque más "correcto"?

Aquí está el AppComponent

@Singleton @Component(modules = arrayOf(ApplicationModule::class)) interface ApplicationComponent { fun inject(activity: BaseActivity<MvpView, MvpPresenter<MvpView>>) //... fun dataBase(): Database<Realm> } 

aquí está la function en el ApplicationModule

 @Provides @Singleton fun provideDatabase(@AppContext context: App): Database<Realm> { Realm.init(context) val config = RealmConfiguration.Builder() .deleteRealmIfMigrationNeeded() .name("db") .build() Realm.setDefaultConfiguration(config) return RealmDatabase(Realm.getDefaultInstance()) } 

Entonces quiero recibir mi database

 @Provides @ActivityScope fun provideDich(database: Database<Realm>) = Someobject(database) 

Y luego veo un logging que dice:

 **Error:com.test.data.storage.Database<? extends io.realm.Realm> cannot be provided without an @Provides-annotated method.** 

Porque dagger2 genera fábricas como esta y hay máscaras java

  public final class Logout_Factory implements Factory<Logout> { private final MembersInjector<Logout> logoutMembersInjector; private final Provider<SessionStorage.CloudStorage> arg0Provider; private final Provider<Database<? extends Realm>> arg1Provider; public Logout_Factory( MembersInjector<Logout> logoutMembersInjector, Provider<SessionStorage.CloudStorage> arg0Provider, Provider<Database<? extends Realm>> arg1Provider) { assert logoutMembersInjector != null; this.logoutMembersInjector = logoutMembersInjector; assert arg0Provider != null; this.arg0Provider = arg0Provider; assert arg1Provider != null; this.arg1Provider = arg1Provider; } @Override public Logout get() { return MembersInjectors.injectMembers( logoutMembersInjector, new Logout(arg0Provider.get(), arg1Provider.get())); } public static Factory<Logout> create( MembersInjector<Logout> logoutMembersInjector, Provider<SessionStorage.CloudStorage> arg0Provider, Provider<Database<? extends Realm>> arg1Provider) { return new Logout_Factory(logoutMembersInjector, arg0Provider, arg1Provider); } } 

Tuve el mismo problema y descubrí la solución.

@JvmWildcard declarar @JvmWildcard en su tipo de devolución de método @Provide .

 @Provides @Singleton fun provideDatabase(@AppContext context: App): Database<@JvmWildcard Realm> { Realm.init(context) val config = RealmConfiguration.Builder() .deleteRealmIfMigrationNeeded() .name("db") .build() Realm.setDefaultConfiguration(config) return RealmDatabase(Realm.getDefaultInstance()) } 
  • Estudio Android convertido a Kotlin: use @JvmStatic en algunos casos
  • Error de data binding en Android Spinner
  • Buscador privado y establecedor público para una propiedad de Kotlin
  • ¿Cómo get los nombres de los parameters a través de la reflexión en kotlin?
  • Pasando lambda en lugar de interfaz
  • Importación de método estático en Kotlin
  • la demostración del reino de Kotlin no se puede ejecutar
  • Operador de asterisco de Kotlin antes del nombre de la variable o Operador de extensión en Kotlin
  • ¿Es esta la manera correcta de lanzar
  • Funciones previas en Kotlin: buenas prácticas
  • pliega los pares en el map del set; crear inputs de map si no existen ya