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

在Dagger中实现获取互为子集的同类型两个集合的方法

解决方案

1. 修正Component中的注解匹配错误

你的PersonComponent里getAllPeople()方法标注了@Named("jane"),但实际要返回的是包含Jane的全集,需对应Module中@Named("all")的集合,所以要修改注解:

package myown;

import dagger.Component;

import javax.inject.Named;
import javax.inject.Singleton;
import java.util.Set;

@Component(modules = PersonModule.class)
@Singleton
public interface PersonComponent {
    @Named("all")
    Set<Person> getAllPeople(); // 修正注解为"all",对应全集
    @Named("exceptJane")
    Set<Person> getAllPeopleExceptJane();
}

2. 修正Module中的集合绑定逻辑

  • allExceptJane方法:直接注入Dagger通过@IntoSet自动收集的未命名Set<Person>,将其绑定为@Named("exceptJane")的子集。
  • 确保all方法返回的@Named("all")集合正确包含子集和Jane。

修正后的PersonModule:

package myown;

import dagger.Module;
import dagger.Provides;
import dagger.multibindings.IntoSet;

import javax.inject.Named;
import javax.inject.Singleton;
import java.util.HashSet;
import java.util.Set;

@Module
public class PersonModule {
    @Singleton
    @Named("jane")
    @Provides
    public Person jane() {
        return new Person("Jane");
    }

    @Singleton
    @Provides
    @IntoSet
    public Person joshua() {
        return new Person("Joshua");
    }

    // 将Dagger自动收集的未命名Set绑定为@Named("exceptJane")的子集
    @Singleton
    @Provides
    @Named("exceptJane")
    public Set<Person> allExceptJane(Set<Person> intoSetCollectedPeople) {
        return intoSetCollectedPeople;
    }

    // 构建全集:子集 + Jane
    @Singleton
    @Provides
    @Named("all")
    public Set<Person> all(@Named("exceptJane") Set<Person> allExceptJane,
                           @Named("jane") Person jane) {
        Set<Person> all = new HashSet<>(allExceptJane);
        all.add(jane);
        return all;
    }
}

错误原因分析

你遇到的MissingBinding错误,是因为PersonComponent要求提供@Named("jane")的Set<Person>,但你的Module中只提供了@Named("jane")的单个Person对象,没有对应注解的集合绑定。修正Component的注解后,这个依赖会指向Module中@Named("all")的集合,解决绑定缺失问题。

关键逻辑说明

  • Dagger的@IntoSet会自动收集所有标注该注解的Person实例,生成一个未命名的Set<Person>,可直接注入这个集合作为子集的基础。
  • 通过@Named注解区分两个同类型的Set<Person>,避免类型擦除导致的依赖混淆,无需包装新类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:12:29