我有一个带有TreeMap字段和构造函数的类Timeline:
public class Timeline{
private TreeMap<DateTime, Schedulable> schedule;
public Timeline(TreeMap<DateTime, Schedulable> schedule) {
this.schedule = schedule;
}
}
我有一个Activity类,其中有一个Timeline作为字段:
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扩展Schedulable的地方。
要求:
时间轴应允许其他人在其时间轴上调度Schedulable的任何子类(不需要在TreeMap中保持一致)
活动的字段legalTimes的时间线上应仅包含LegalTime
我认为这段代码应该有效,因为LegalTime是Schedulable的子类。我也无法添加采用TreeMap的第二个构造函数,因为它具有相同的擦除。
我该如何解决?
最佳答案
通常,即使B
扩展了A
,但Type<B>
也不是Type<A>
,因为Java泛型是不变的。这意味着TreeMap<DateTime, LegalTime>
不是TreeMap<DateTime, Schedulable>
,即使LegalTime
是Schedulable
。
解决方案:
将构造函数(和相应的实例变量)声明为TreeMap<DateTime, ? extends Schedulable>
。
要么
使Timeline
为泛型,并且泛型类型参数为所需的特定Schedulable
:
尝试:
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>());