You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hilt迁移多实现接口注入时触发Dagger/DuplicateBindings错误

解决Hilt中多实现类绑定同一接口的重复绑定问题

问题原因

你给SomeInterface同时绑定了First和Second两个实现类,Dagger/Hilt无法自动判断该注入哪一个实例,因此抛出重复绑定的错误。

解决步骤

1. 定义自定义限定符注解

通过限定符标记不同的实现类,创建两个注解用于区分:

import javax.inject.Qualifier;

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface FirstImpl {}

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface SecondImpl {}

2. 修改Hilt模块的绑定逻辑

给每个@Provides方法加上对应的限定符,明确绑定关系:

@Module
@InstallIn(SingletonComponent.class)
public class InterfaceBindingModule {
    @Provides
    @FirstImpl // 标记此绑定对应First实现
    public SomeInterface getFirst(First first) {
        return first;
    }

    @Provides
    @SecondImpl // 标记此绑定对应Second实现
    public SomeInterface getSecond(Second second) {
        return second;
    }
}

3. 在注入时指定要使用的实现

在OnePresenter的构造参数上添加限定符,告诉Hilt你需要注入哪个实现的实例:

public class OnePresenter {
    @Inject
    public OnePresenter(@FirstImpl SomeInterface someInterface) {
        // 这里注入的是First类的实例
    }

    // 如果需要使用Second实现,只需把注解换成@SecondImpl即可
    // public OnePresenter(@SecondImpl SomeInterface someInterface) {}
}

额外优化:简化绑定代码

你也可以直接在实现类的构造器上添加限定符,省去编写Provides方法的步骤:

public class First implements SomeInterface { 
    @Inject
    @FirstImpl
    public First(@NonNull final SomeParam someParam){
        this.someParam = someParam;
    }
}

public class Second implements SomeInterface { 
    @Inject
    @SecondImpl
    public Second(@NonNull final SomeParam someParam){
        this.someParam = someParam;
    }
}

这种情况下可以直接删除InterfaceBindingModule,Hilt会自动识别带限定符的构造器完成绑定。

内容的提问来源于stack exchange,提问作者Anji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 09:36:26