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>());