在下面的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<>
类型本身是协变的;一般方差是在类型的使用时完成的。