2017-01-10 8 views
2

サブグラフで公開されるジェネリック型を返すようにしたいのですが、問題は自動生成されたJavaクラスにありますが、これを解決するには、AppComponentからジェネリック型を削除し、単純なオブジェクトを返すことです。もっと「正しい」アプローチがありますか?ここでDot2 2 Kotlinで、ApplicationComponent内のジェネリックでタイプを返す

はここAppComponent

@Singleton 
@Component(modules = arrayOf(ApplicationModule::class)) 
interface ApplicationComponent { 
    fun inject(activity: BaseActivity<MvpView, MvpPresenter<MvpView>>) 

    //... 
    fun dataBase(): Database<Realm> 
} 

ある機能は、その後、私は私のデータベース

@Provides @ActivityScope fun provideDich(database: Database<Realm>) = Someobject(database) 
を受信したい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()) 
} 

であります

そして私は言いログを参照してください。

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

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); 
    } 
} 

答えて

2

があるので、私は同じ問題を抱えていたと私は解決策を見つけました。

@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()) 
} 
関連する問題