0

我有一个带有 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 的构造函数,因为它具有相同的擦除。

我该如何解决这个问题?

4

1 回答 1

7

通常,即使Bextends A, aType<B>也不是 a ,因为 Java 泛型是不变的Type<A>这意味着 aTreeMap<DateTime, LegalTime>不是 a TreeMap<DateTime, Schedulable>,即使LegalTime是 a 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>());
于 2013-11-07T21:35:57.537 回答