我正在开发一个工厂,可以使用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作为参数传递给工厂的方法以防止出现这种情况。
答案 0 :(得分:2)
你唯一能做的就是提供一个标记界面,让我们说ConcreteAbility
并拥有<T extends Ability & ConcreteAbility>
。然后你需要实现具有所有具体能力的ConcreteAbility。