Если вам нужна карта Provider< ? extends Issue>> map
, вам нужно использовать Issue
в качестве типа, возвращаемого в вашем модуле. Кинжал не будет сам по себе кастовать или угадывать.
@Provides
@Singleton
@IntoMap
@StringKey("simple_issue")
public Issue provideSimpleIssue() {
return new SimpleIssue();
}
что делать в случае, если мне нужен Модуль, который предоставляет базовый класс (Issue) для Map, а также нужен поставщик конкретного класса (SimpleIssue), и я хотел бы, чтобы он был Singleton (один и тот же экземпляр возвращается в обоих случаях )
В этом случае вы предоставляете @Singleton
из SimpleIssue
.
@Provides
@Singleton
public SimpleIssue provideSimpleIssue() {
return new SimpleIssue();
}
// or you can use constructor injection, dropping the method above...
@Singleton
public class SimpleIssue {
@Inject
public SimpleIssue(...) {
}
}
Затем вы привязываете этот экземпляр к карте. В области видимости нет необходимости, поскольку реализация должна объявить ее (как сделано выше).
@Provides
@IntoMap
@StringKey("simple_issue")
public Issue provideSimpleIssue(SimpleIssue issue) {
return issue;
}
// or alternatively with `@Binds` when using an abstract class / interface
// this leads to actually better performing dagger code
@Binds
@IntoMap
@StringKey("simple_issue")
public Issue provideSimpleIssue(SimpleIssue issue);