Java:使用父类作为类型参数的构造函数
我有一个带有树映射字段和构造函数的类时间轴,如下所示:Java:使用父类作为类型参数的构造函数,java,generics,inheritance,constructor,Java,Generics,Inheritance,Constructor,我有一个带有树映射字段和构造函数的类时间轴,如下所示: public class Timeline{ private TreeMap<DateTime, Schedulable> schedule; public Timeline(TreeMap<DateTime, Schedulable> schedule) { this.schedule = schedule; } } 我有一个课堂活动,有一个时间轴作为一个字段:
public class Timeline{
private TreeMap<DateTime, Schedulable> schedule;
public Timeline(TreeMap<DateTime, Schedulable> schedule) {
this.schedule = schedule;
}
}
我有一个课堂活动,有一个时间轴作为一个字段:
public class Activity extends Schedulable implements Serializable {
private Timeline legalTimes;
public Activity() {
legalTimes = new Timeline(new TreeMap<DateTime, LegalTime>());
//error here for can't find constructor ^^^^^
}
LegalTime扩展到可调度的位置
要求:
时间轴应该允许其他人在其时间轴上调度任何可调度的子类,而不需要在树映射中保持一致
活动的字段LegalTime只能在其时间线上有LegalTime
我认为这段代码应该可以工作,因为LegalTime是Schedulable的一个子类。我也不能添加第二个接受TreeMap的构造函数,因为它具有相同的擦除
如何解决这个问题?一般来说,即使B扩展了A,A类型也不是类型,因为Java泛型是不变的。这意味着树映射不是树映射,即使LegalTime是可调度的
解决方案:
将构造函数和相应的实例变量声明为树映射。
或
将时间线设置为通用,通用类型参数为所需的特定可调度参数:
尝试:
及
与
缺点:作为一个最佳实践,考虑在TimeLead构造函数中制作TeaMeP计划的防御副本,并将副本分配给调度实例变量。这不要求树图中的每一个都是可调度的同一个子类吗?我的想法是,其他一些类可以使用它作为通用的时间线,这样它就可以在同一时间线上安排活动、会议或通勤,只要它们扩展了可调度的时间线
public class Timeline<T extends Schedulable> {
private TreeMap<DateTime, T> schedule;
public Timeline(TreeMap<DateTime, T> schedule) {
this.schedule = schedule;
}
}
private Timeline<LegalTime> legalTimes;
legalTimes = new Timeline<LegalTime>(new TreeMap<DateTime, LegalTime>());