你的问题并不完全清楚。它看起来像你试图使用枚举常量来表示一个抽象类的具体子类,并且你希望能够使用这些常量来实例化对象。这是可能的:
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'对象? (通过反射?) –