我正在尝试将现有类转换为使用泛型,并且在转换构造函数时感到难过。
原始类是一个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
s的目标。我认为最好的方法是将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
无法实例化。是否可以在此上下文中实例化泛型类型对象?
答案 0 :(得分:4)
你基本上有两个选择:
1.要求实例:
public Navigation(T t) {
this("", "", t);
}
2.获取一个类实例:
public Navigation(Class<T> c) {
this("", "", c.newInstance());
}
您可以使用工厂模式,但最终您将面临同样的问题,但只需将其推送到代码中的其他位置。
答案 1 :(得分:2)
不,而且你想要的事实似乎是一个坏主意。你真的需要像这样的默认构造函数吗?
答案 2 :(得分:2)
由于erasure类型,您无法new T()
。默认构造函数只能是
public Navigation() {
this("", "", null);
}
您可以创建其他构造函数以提供触发器和描述的默认值。您需要T
的具体对象。