Java: переопределяющий метод в классе Derrived с другим типом возвращаемого значения? - PullRequest
2 голосов
/ 29 мая 2011

В следующем 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()));
    } 
}

1 Ответ

3 голосов
/ 29 мая 2011

Ну, вы можете изменить метод базового класса на:

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<> ковариантен;общая дисперсия выполняется при использовании типа.

...