首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java中将泛型类型转换为具体类型

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

Stack Overflow用户
提问于 2015-10-05 21:59:12
回答 1查看 1.4K关注 0票数 0

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

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

如果有人能为这种情况提供一些正确方向的指示,那将是非常有帮助的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-05 22:35:20

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

代码语言:javascript
复制
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):

代码语言:javascript
复制
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();
    }
}

这种方法不使用反射,不涉及检查异常,而且更通用,因为它可以用于只有静态工厂方法而没有公共构造函数的类。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32958604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档