[英]Instantiating a generic type
我正在嘗試將現有類轉換為使用泛型,並且在轉換構造函數時感到難過。
原始類是一個POJO,包含在基於文本的控制台游戲中從一個房間移動到另一個房間的邏輯。 從字面上看,它是一個類,它包含一些可觸發動作的字符串觸發器(例如,用戶鍵入“向右走”),描述和指向新位置的指針。
該類的當前非泛型版本如下所示:
public class Navigation implements Serializable {
private static final long serialVersionUID = 1L;
private String trigger;
private String description;
private Location target;
public Navigation() {
this("", "", new Location());
}
public Navigation(String trigger, String description, Location target) {
this.trigger = trigger;
this.description = description;
this.target = target;
}
// plus getters, setters, etc.
}
( Location
類是另一個描述位置的POJO。它是無關緊要的。)
我想擴展Navigation
類,以便能夠處理不是Location
的目標。 我認為最好的方法是將Navigation
類轉換為使用泛型,所以我嘗試了這個:
public class Navigation<T> implements Serializable {
private static final long serialVersionUID = 2L;
private String trigger;
private String description;
private T target;
public Navigation() {
this("", "", new T());
}
public Navigation(String trigger, String description, T target) {
this.trigger = trigger;
this.description = description;
this.target = target;
}
// plus getters, setters, etc.
}
但是,這不會在此行編譯this("", "", new T());
因為T
無法實例化。 是否可以在此上下文中實例化泛型類型對象?
你基本上有兩個選擇:
1.需要一個實例:
public Navigation(T t) {
this("", "", t);
}
2.獲取一個類實例:
public Navigation(Class<T> c) {
this("", "", c.newInstance());
}
您可以使用工廠模式,但最終您將面臨同樣的問題,但只需將其推送到代碼中的其他位置即可。
不,而且你想要的事實似乎是一個壞主意。 你真的需要像這樣的默認構造函數嗎?
由於類型擦除,你不能做new T()
。 默認構造函數只能是
public Navigation() {
this("", "", null);
}
您可以創建其他構造函數以提供觸發器和描述的默認值。 你需要一個T
的具體對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.