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