簡體   English   中英

如何在Java中將泛型轉換為具體類型

[英]How to convert a generic type to a concrete type in Java

嗨,我目前正在處理一些繼承的舊代碼,我需要將一種類型轉換為另一種類型以結束重構。 我遇到的問題是我有一個返回Class<AbstractSuperClass>的對象,但我需要將其轉換為AbstractSuperClass //(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塊中執行此操作,因為這些異常是已檢查的異常。

我個人不喜歡為此使用反射。 我認為使用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();
    }
}

這種方法不使用反射,不涉及檢查的異常,並且更通用,因為它可以與僅具有靜態工廠方法且沒有公共構造函數的類一起使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM