我正在開發一個工廠,它可以通過使用Class參數實例化類型爲Objects的對象。該工廠的代碼是:ObjectFactory與<?>參數
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 。
我想知道我是否可以像「?extends Ability but Ability」那樣做一些約束,或者它只是一個糟糕的設計,我應該把例如Enum作爲參數傳遞到工廠的方法中以防止出現這種情況。
我不明白爲什麼這會是一個問題,只是不要傳遞Ability.class作爲參數。 – FINDarkside 2015-02-05 15:53:10
如果你所有的'Ability'子類都有一個默認的構造函數,並且你需要'Class'對象來使用這個工廠來實例化它,那麼有什麼意義呢?爲什麼不使用新的操作符,並避免反射? – 2015-02-05 15:53:14
@FINDarkside好,那麼泛型的全部用途正在消失。在編譯時你不能確定一個錯誤的參數。 – Zarial 2015-02-05 15:58:17