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