如何解决Java:具有不同返回类型的派生类中的重写方法?
| 在以下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<>
类型本身是协变的;泛型差异是在使用类型时完成的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。