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

时间:2015-10-05 21:59:13

标签: java generics

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

我尝试做的是使用枚举常量来表示抽象类的具体子类,然后使用常量来实例化对象。但是我所有的铸造尝试都失败了。

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

1 个答案:

答案 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();
    }
}

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