匕首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()) }