Я хотел бы знать, как я могу хранить классы, реализующие IModule, в Set, а затем возвращать экземпляр класса, а не экземпляр IModule. Например, я хочу, чтобы работало что-то вроде этого:
ModuleService m = new ModuleService();
m.register(new CoreModule(this));
m.getRegistration(CoreModule.class);
ModuleService # getRegistration должен возвращать CoreModule, а не IModule. Я пробовал использовать дженерики Capture и T, но вы не можете использовать T для полей, а их использование в классе не имеет особого смысла.
Использование? generi c:
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);
}
Но это ошибки в modules.add (module); потому что T не?, ни одно из того, что я пробовал, на самом деле не работает, поэтому я спрашиваю здесь