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<>
类型本身是协变的;泛型差异是在使用类型时完成的。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...