编程语言-Java:具有不同返回类型的派生类中的重写方法



在下面的java代码中,无论是否使用@Override语句,NetBeans都会抱怨。如果Override不存在,我会得到一个错误,即返回类型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()));
    } 
}

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

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

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

现在,即使实际上不是一个setFirst方法,所有这些都适用了——因为你不能告诉Java编译器Pair<>类型本身是协变的;一般方差是在类型的使用时完成的。

最新更新