2017-01-10 11 views
2

Ich möchte Typ mit generischen durch Sub-Graphen ausgesetzt werden, das Problem ist in automatisch generierten Java-Klassen, habe ich versucht, etwas zu tun, aber die eine Möglichkeit um es zu lösen ist es, generischen Typ aus AppComponent zu entfernen und einfaches Objekt zurückzugeben. Gibt es einen "richtigen" Ansatz?Dolch 2 mit Kotlin, zurückgebende Art mit generischen in ApplicationComponent

Hier ist die AppComponent

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

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

hier ist Funktion in der 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()) 
} 

Dann will ich meine Datenbank

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

Und dann ich log sehen, der sagt:

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

Da dagger2 erzeugt Fabriken wie diese und es gibt Java-Masken

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

Antwort

2

Ich hatte das gleiche Problem und ich die Lösung fand heraus, .

Sie müssen die @JvmWildcard in Ihrem @Provide Methode Rückgabetyp deklarieren.

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