问题描述
|
在以下Java代码中,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());
从编译器的角度来看,这看起来不错,但是不太可能应该在ѭ1上调用setFirst(Interval)
。
现在,即使实际上没有setFirst
方法,所有这些都适用-因为您无法告诉Java编译器Pair<>
类型本身是协变的;泛型差异是在使用类型时完成的。