当前位置: 首页 > 面试题库 >

Dagger2-两个提供相同界面的方法

郑富
2023-03-14
问题内容

可以说我有:

public interface Shape  {}


public class Rectangle implements Shape {

}

public class Circle implements Shape {

}

我有一个 ApplicationModule ,它需要为 RecCircle 提供实例:

@Module
public class ApplicationModule {
    private Shape rec;
    private Shape circle;

    public ApplicationModule() {
        rec = new Rectangle();
        circle= new Circle ();
    }

    @Provides
    public Shape provideRectangle() {
        return rec ;
    }

    @Provides
    public Shape provideCircle() {
        return circle;
    }
}

ApplicationComponent

@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
    Shape provideRectangle();
}

以这种方式使用代码-无法编译。错误说

错误:(33,20)错误:形状被绑定多次。

对我来说,这是不可行的,因为该组件正试图找到一个Shape实例,并且它找到了两个实例,因此它不知道要返回哪个实例。

我的问题是-我该如何处理?


问题答案:

我最近在这篇文章中发布了这样一个问题的答案:

Dagger2:使用@Named获取同一对象的多个实例时出错

您需要@Named("someName")像这样在模块中使用:

@Module
public class ApplicationModule {
private Shape rec;
private Shape circle;

public ApplicationModule() {
    rec = new Rectangle();
    circle= new Circle ();
}

@Provides
 @Named("rect")
public Shape provideRectangle() {
    return rec ;
}

@Provides
 @Named("circle")
public Shape provideCircle() {
    return circle;
}

}

然后,只要您需要注入它们,只需编写

@Inject
@Named("rect")
 Shape objRect;

它很有趣,但是您必须以不同的方式在Kotlin中注入:

@field:[Inject Named("rect")]
lateinit var objRect: Shape


 类似资料:
  • 我在xml文件中使用了约束布局。我有一个类似例子中的视图。Imageview和textview。我希望这两个在点击后有相同的动作。怎么才能把两者组合在一起,给他们一个id? xml:

  • 我正在使用代码优先和EF6创建一个小项目,但现在我面临一个问题: 如果一个实体有一个自动ID PK,并且例如3个实体(ID:1,ID:2,ID:4-Id3已删除),那么克隆上下文将具有(ID:1,ID:2,ID:3)的实体。 我的问题是:有没有办法强制AI PK的值,或者至少强制跳过ID?或者,是否有通过dbcontexts将数据库复制到另一个数据库的最佳方法? 我在这里发现了一篇关于编程生成ID

  • ssh-keygen和openssl是否可能从同一个私钥生成两个不同的公钥?命令与命令生成的公钥(和之间的内容)不同。

  • 现在我们准备去创建一个DetailActivity。我们详情activity将会接收一组从主activity传过来的参数:forecast id和城市名称。第一个参数将会用来从数据库中请求数据,城市名称用于显示在toolbar上。所以我们首先需要定义一组参数的名字: public class DetailActivity : AppCompatActivity() { companion

  • 问题内容: 假设我有这个: 我想以该类之外最简单的方式遍历每个对象。我应该怎么做呢?我考虑过这样做: 遵循这些原则。 无论如何,问题是我不能真正从next()返回单个对象,并且我也不能让Iterator接受多个类型。那么,有什么想法吗? 另外,我不能开设新课程来将MobileSuit和Pilot相结合。我需要将它们分开,即使我一次遍历两者。原因是可能有没有飞行员的机动战士,而且我不确定如何通过将他

  • 我改变了切入点的顺序,它总是排在第二位。关于如何解决这个问题有什么想法吗? 更新 一旦我发布了这个问题,我就有了一个想法。我这样更改了切入点: 现在异常消失了,但仍然有一个小问题(我想这个问题更容易解决):因为ArrayList实现了可序列化,所以至少在我使用ArrayList的测试用例中,两个切入点都被执行了。 我将对此进行研究,并发布我的发现,但也感谢您的帮助;) 我将代码改为只使用一个切入点