在以下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()));
}
}
答案 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 处完成的。