JAVA - Хранить классы, реализующие интерфейс, а затем возвращать экземпляр - PullRequest
0 голосов
/ 12 июля 2020

Я хотел бы знать, как я могу хранить классы, реализующие 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 не?, ни одно из того, что я пробовал, на самом деле не работает, поэтому я спрашиваю здесь

1 Ответ

1 голос
/ 12 июля 2020

Вот простой способ реализовать это

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...