Java:具有不同返回类型的派生类中的重写方法?

时间:2011-05-29 15:20:56

标签: java programming-languages overloading

在以下java代码中,无论是否使用@Override语句,NetBeans都会抱怨。 如果不存在覆盖,则会收到错误,返回类型Pair<Interval, Interval>Pair<ExtendedInterval, ExtendedInterval>不兼容。解释器建议我添加一个@Override语句。但是,@ Override语句出现相同的错误。

让这个错误消失的最佳方法是什么?我更希望调用者不必将返回的对象强制转换为正确的类。

public class Interval {
    private Date left;
    private Date right;

    public Pair<Interval, Interval> split(Date dt){
        ...
        return new Pair<Interval, Interval>(
                        new Interval(left, dt),
                        new Interval(dt, right));
    }
}

public class ExtendedInterval extends Interval {
    private Data localData;

    @Override
    public Pair<ExtendedInterval, ExtendedInterval> split(Date dt){
        Pair<Interval, Interval> baseInterval = super.split(dt);
        return new Pair<ExtendedInterval, ExtendedInterval>(
                              new ExtendedInterval(localData, baseInterval.first()),
                              new ExtendedInterval(localData, baseInterval.second()));
    } 
}

1 个答案:

答案 0 :(得分:3)

好吧,您可以将基类方法更改为:

public Pair<? extends Interval, ? extends Interval> split(Date dt)

我相信这会奏效。

问题在于,如果没有它,它就不是类型安全的。假设Pair有一个setFirst()方法来设置该对的第一部分。然后你可以:

Interval x = new ExtendedInterval();
Pair<Interval, Interval> pair = x.split(new Date());
pair.setFirst(new Interval());

从编译器的角度来看,这看起来很好,但是你不可能在setFirst(Interval)上调用Pair<ExtendedInterval, ExtendedInterval>

现在所有这些都适用,即使不是实际上是setFirst方法 - 因为你无法告诉Java编译器Pair<>类型本身是协变的;通用方差是在类型的 use 处完成的。