Dagger2:具有泛型的通配符

时间:2018-07-04 15:41:09

标签: dagger-2

我通常对Dagger2和DI还是陌生的,但是我对用注入的键/值填充地图感兴趣。问题是,如果我提供确切的类型,它会起作用,我不能使其与通配符一起使用,对此有任何解决方案?

@Module
public class SimpleIssueModule
{
  @Provides
  @Singleton
  @IntoMap
  @StringKey("simple_issue")
  public SimpleIssue provideSimpleIssue()
  {
    return new SimpleIssue();
  }
}

@Module
public class DaggerFactoryModule
{
  @Provides
  @Singleton
  public Factory provideFactory(Map<String, Provider< ? extends Issue>> map)
  {
    return new Factory(map);
  }
}

1 个答案:

答案 0 :(得分:3)

如果要映射Provider< ? extends Issue>> map,则需要使用Issue作为模块中返回的类型。 Dagger不会自行进行任何投射或猜测。

@Provides
@Singleton
@IntoMap
@StringKey("simple_issue")
public Issue provideSimpleIssue() {
  return new SimpleIssue();
}
  

在需要一个向Map提供基类(Issue)并且还需要具体类(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(...) {
  }
}

然后将这个实例绑定到Map中。不需要范围,因为实现应该声明它(如上所述)。

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