我正在开发一个工厂,它可以通过使用 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 作为参数传递给工厂的方法来防止这种情况。