我有一个带有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>,即使LegalTimeSchedulable

解决方案:


将构造函数(和相应的实例变量)声明为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>());

07-24 22:23