Den*_*ski 5 java generics android kotlin dagger-2
我想返回带有泛型的类型,通过子图公开,问题出在自动生成的java类中,我试着做一些事情,但解决它的一种方法是从AppComponent中删除泛型类型并返回简单对象.有更"正确"的方法吗?
这是AppComponent
@Singleton
@Component(modules = arrayOf(ApplicationModule::class))
interface ApplicationComponent {
fun inject(activity: BaseActivity<MvpView, MvpPresenter<MvpView>>)
//...
fun dataBase(): Database<Realm>
}
Run Code Online (Sandbox Code Playgroud)
这是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())
}
Run Code Online (Sandbox Code Playgroud)
然后我想收到我的数据库
@Provides @ActivityScope fun provideDich(database: Database<Realm>) = Someobject(database)
Run Code Online (Sandbox Code Playgroud)
然后我看到日志说:
**Error:com.test.data.storage.Database<? extends io.realm.Realm> cannot be provided without an @Provides-annotated method.**
Run Code Online (Sandbox Code Playgroud)
因为dagger2生成这样的工厂并且有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);
}
}
Run Code Online (Sandbox Code Playgroud)
小智 8
我有同样的问题,我找到了解决方案.
你需要声明@JvmWildcard你的@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())
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
652 次 |
| 最近记录: |