簡體   English   中英

Java實例化泛型類型

[英]Java Instantiate Generic Type

我有一個接受兩個參數化類型的類,並且我想有一個返回一個類型的新實例的方法。 這是課程:

public class StateMachine<S extends State, E extends StateObject> {

    // State
    protected ArrayMap<S, E> states;
    protected E currentState;
    protected Entity entity;

    // Bits
    private Builder builder = new Builder();
    private int bitOffset;
    private boolean firstState = false;

    public StateMachine(Entity entity) {
        this.entity = entity;
        states = new ArrayMap<S, E>();
    }

    public E createState(S key) {
        // State identifiers must also be taggable
        assert (key instanceof Tag);
        if (!firstState) {
            firstState = true;
            bitOffset = key.numStates();
        }
        E state = (E) new StateObject(entity);
        state.bitOffset = bitOffset;
        state.bits.set(((Tag) key).getIndex());
        states.put(key, state);
        return state;
    }

    // Remainder omitted....

}

如您所見,我想創建一個狀態並根據參數化類型返回其值。 目前,我有一個EntityState延伸類StateObject並具有EntityStateMachine延伸StateMachine與參數<StateIdentifier, EntityState> 但是,當我從EntityStateMachine調用createState時,返回的值不是EntityState而是StateObject

如何確保將返回值轉換為正確的參數化類型?

處理此問題的Java模式是存儲Class<E> ,並使用其newInstance方法,如下所示:

// Class<E> object will be used to create new instances
private final Class<E> stateClass;
// Users will pass the class to StateMachine's constructor
public StateMachine(Entity entity, Class<E> stateClass) {
    this.entity = entity;
    this.stateClass = stateClass;
    states = new ArrayMap<S, E>();
}

現在,您可以如下創建新的狀態對象:

E state = stateClass.newInstance(); // Only parameterless constructors are supported
state.setEntity(entity);

如何確保將返回值轉換為正確的參數化類型?

這不是您應該問的問題。 真正的問題是

如何創建類型參數的實例?

答案當然是“沒有辦法”。 您需要一種解決方法,這些是一些想法:

  1. 傳遞Class<YourType>的實例,以便可以反射地創建該實例。
  2. 通過工廠的YourType對象。
  3. 傳遞YourType的實例,在其上定義類似newInstance的方法,並將其用作包含更多相同類型對象的工廠。

暫無
暫無

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

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