具有Class <! - ? - >参数的ObjectFactory

时间:2015-02-05 15:49:52

标签: java class generics objectfactory

我正在开发一个工厂,可以使用Class参数实例化Ability类型的对象。该工厂的代码是:

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.AbilityFactory.getAbility(Ability.class)); 

导致 java.lang.InstantiationException

我想知道我是否可以制定一些限制,例如“?extend Ability but not ability”,或者它只是一个糟糕的设计,我应该将Enum作为参数传递给工厂的方法以防止出现这种情况。

1 个答案:

答案 0 :(得分:2)

你唯一能做的就是提供一个标记界面,让我们说ConcreteAbility并拥有<T extends Ability & ConcreteAbility>。然后你需要实现具有所有具体能力的ConcreteAbility。