JAVA—存储实现接口的类,然后返回实例

JAVA—存储实现接口的类,然后返回实例,java,generics,Java,Generics,我想知道如何将实现IModule的类存储到一个集合中,然后返回该类的实例,而不是IModule的实例。例如,我希望这样的工作: ModuleService m = new ModuleService(); m.register(new CoreModule(this)); m.getRegistration(CoreModule.class); ModuleService#getRegistration应返回CoreModule,而不是IModule。我尝试过使用Capture泛型和T,但不能

我想知道如何将实现IModule的类存储到一个集合中,然后返回该类的实例,而不是IModule的实例。例如,我希望这样的工作:

ModuleService m = new ModuleService();
m.register(new CoreModule(this));
m.getRegistration(CoreModule.class);
ModuleService#getRegistration应返回CoreModule,而不是IModule。我尝试过使用Capture泛型和T,但不能在字段上使用T,在类上使用它们也没有多大意义

使用?通用:

private Set<? extends IModule> modules = new HashSet<>();

public ModuleService(STBot bot) {
    this.bot = bot;
}

public <T extends IModule> boolean register(T module) {
    if (modules.stream().noneMatch(m -> m.getId().equalsIgnoreCase(module.getId()))) {
        modules.add(module);
        return true;
    } else return false;
}

public Optional<? extends IModule> getRegistration(Class clazz) {
    return modules.stream().filter(m -> m.getClass().equals(clazz)).findFirst();
}

public Set<? extends IModule> getModules() {
    return Collections.unmodifiableSet(modules);
}

private Set这里有一个简单的实现方法

public class ModuleService {
    private Map<Class<?>, IModule> modules = new HashMap<>();

    public void register(IModule module) {
        modules.put(module.getClass(), module);
    }

    public <T extends IModule> T getRegistration(Class<? extends T> clazz) {
        return (T) modules.get(clazz);
    }
}
公共类模块服务{

私有的Map@user编辑postJust use
Set
通配符意味着该集合中的所有iModule都是您不知道的某种类型,这可能不是您在这里想要的。此外,您的
getRegistration
方法可以设置为
Optional getRegistration(Class clazz){…}
是的,但是我不能在片场上使用它,所以我不能像那样存储它。嗯?你不能在
集上使用什么?使用
没有一个有界通配符是完全正确的谢谢!这很有效,只是将它改为返回一个可选的。你能解释一下类是什么吗
类吗