你的問題並不完全清楚。它看起來像你試圖使用枚舉常量來表示一個抽象類的具體子類,並且你希望能夠使用這些常量來實例化對象。這是可能的:
public enum ConcreteClass {
CONCRETE1(Concrete1.class),
CONCRETE2(Concrete2.class);
private final Class<? extends AbstractClass> clazz;
private ConcreteClass(Class<? extends AbstractClass> clazz) {
this.clazz = clazz;
}
public AbstractClass instantiate() throws InstantiationException, IllegalAccessException {
return clazz.newInstance();
}
}
用這個你可以做AbstractClass obj = ConcreteClass.CONCRETE2.instantiate();
。您必須在try
塊中執行此操作,因爲這些例外是已檢查的例外情況。
就我個人而言,我不喜歡使用反射。我想用Supplier<AbstractClass>
是更好的(需要Java 8):
public enum ConcreteClass {
CONCRETE1(Concrete1::new),
CONCRETE2(Concrete2::new);
private final Supplier<AbstractClass> supplier;
private ConcreteClass(Supplier<AbstractClass> supplier) {
this.supplier = supplier;
}
public AbstractClass instantiate(){
return supplier.get();
}
}
這種方法不使用反射,不涉及檢查異常,而且是更普遍的,因爲它可以與只具有靜態類使用工廠方法和沒有公共構造函數。
'Class'對象不是'AbstractSuperClass'對象。鑄造將永遠不會工作。請說明你在做什麼或試圖做什麼。 –
嗨,謝謝你的回答,我試圖做的是通過enum(ENUMVAL(baseClassFoo).class)返回Class,如果我能成功地將此返回類型轉換爲我在其他類中的抽象類方法我可以消除大量冗餘代碼,並使用baseClassFoo中定義的算法,而不必使用動態調度來檢查條件。 –
JKT
你問如何實例化一個類,因爲它的'Class'對象? (通過反射?) –