如何在Java中将泛型转换为具体类型

捷运

嗨,我目前正在处理一些继承的旧代码,我需要将一种类型转换为另一种类型以结束重构。我遇到的问题是我有一个返回a的对象,Class<AbstractSuperClass>但我需要将其转换为aAbstractSuperClass //(concrete object although abstract)

我试图做的是使用枚举常量表示抽象类的具体子类,然后使用这些常量实例化对象。但是到目前为止,我所有的铸造尝试都以失败告终。

如果有人可以为这种情况提供正确的方向的指示,那将是最有帮助的。

保罗·波丁顿

您的问题并不完全清楚。看起来您正在尝试使用枚举常量来表示抽象类的具体子类,并且希望能够使用这些常量实例化对象。这个有可能:

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块中执行此操作,因为这些异常是已检查的异常。

我个人不喜欢为此使用反射。我认为使用aSupplier<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();
    }
}

该方法不使用反射,不涉及检查的异常,并且更通用,因为它可以与仅具有静态工厂方法且没有公共构造函数的类一起使用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章