[英]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);
如何確保將返回值轉換為正確的參數化類型?
這不是您應該問的問題。 真正的問題是
如何創建類型參數的實例?
答案當然是“沒有辦法”。 您需要一種解決方法,這些是一些想法:
Class<YourType>
的實例,以便可以反射地創建該實例。 YourType
對象。 YourType
的實例,在其上定義類似newInstance
的方法,並將其用作包含更多相同類型對象的工廠。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.