1

我正在开发一个工厂,它可以通过使用 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 类是抽象的,你可以传递这样的东西:

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

这导致java.lang.InstantiationException

我想知道我是否可以做一些约束,比如“?扩展能力而不是能力”,或者这只是一个糟糕的设计,我应该将例如 Enum 作为参数传递给工厂的方法来防止这种情况。

4

1 回答 1

2

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

于 2015-02-05T15:53:51.450 回答