您好我正在处理一些我继承的遗留代码,我需要将一种类型转换为另一种类型以结束我的重构。
我遇到的问题是我有一个返回Class<AbstractSuperClass>
的对象,但我需要将其转换为AbstractSuperClass //(concrete object although abstract)
我尝试做的是使用枚举常量来表示抽象类的具体子类,然后使用常量来实例化对象。但是我所有的铸造尝试都失败了。
如果有人可以为这种情况提供正确方向的指示,那将是最有帮助的。
答案 0 :(得分:3)
你的问题并不完全清楚。看起来您正在尝试使用枚举常量来表示抽象类的具体子类,并且您希望能够使用这些常量来实例化对象。这是可能的:
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();
}
}
这种方法不使用反射,不涉及检查异常,并且更通用,因为它可以用于只有静态工厂方法而没有公共构造函数的类。