匕首2与Kotlin,在ApplicationComponent中返回泛型类型

我想返回与泛型类型被子图公开,问题是在自动生成的Java类,我试图做一些事情,但解决它的一种方法是从AppComponent中删除泛型类型,并返回简单的对象。 有更多的“正确”的方法?

这是AppComponent

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

这里是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()) } 

然后我想收到我的数据库

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

然后我看到日志说:

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

因为匕首2生成这样的工厂,并有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); } } 

我有同样的问题,我找到了解决方案。

您需要在@Provide方法返回类型中声明@JvmWildcard

 @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()) }