Java:使用带有父类的构造函数作为类型参数

时间:2013-11-07 21:29:01

标签: java generics inheritance constructor

我有一个带有TreeMap字段的类时间轴和一个构造函数:

public class Timeline{
    private TreeMap<DateTime, Schedulable> schedule;

    public Timeline(TreeMap<DateTime, Schedulable> schedule) {
            this.schedule = schedule;
    }
}

我有一个以时间轴为字段的类Activity:

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

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:7)

通常,即使B扩展AType<B> <{1}},因为Java泛型不变。这意味着Type<A>不是TreeMap<DateTime, LegalTime>,即使TreeMap<DateTime, Schedulable>LegalTime

解决方案:

  • 将构造函数(和相应的实例变量)声明为Schedulable

OR

  • 使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;