ObjectFactory с аргументом класса<?>

Я разрабатываю фабрику, которая может создавать экземпляры объектов типа Ability с помощью параметра Class. Код для этой фабрики:

public static final class AbilityFactory {
    private AbilityFactory(){}

    public static <T extends Class<A>, A extends Ability> A getAbility(T clazz){
        A ability = null;
        try{
            ability = clazz.newInstance();
        } catch(InstantiationException | IllegalAccessException ex){
            ex.printStackTrace();
        }
        return ability;
    }
}

Код клиента выглядит примерно так:

Ability.AbilityFactory.getAbility(Firebolt.class));

Единственная проблема, которую я понял в этом дизайне, заключается в том, что класс Ability является абстрактным, и вы можете передать что-то вроде этого:

Ability.AbilityFactory.getAbility(Ability.class)); 

что приводит к исключению java.lang.InstantiationException.

Я хотел знать, могу ли я установить некоторые ограничения, такие как "? Расширяет Способность, но не Способность", или это просто плохой дизайн, и я должен передать, например, Enum в качестве аргумента в метод фабрики, чтобы предотвратить эту ситуацию.

1 ответ

Решение

Единственное, что вы можете сделать, это предоставить интерфейс маркера, скажем, ConcreteAbility и имеют <T extends Ability & ConcreteAbility>, Затем вам нужно реализовать ConcreteAbility со всеми конкретными возможностями.

Другие вопросы по тегам