Можно ли вернуть "это" в универсальном интерфейсе с реализацией по умолчанию, используя f-ограниченную квантификацию
public interface IEq<T> {
public abstract Boolean testEqual(final T y);
public default Boolean testNotEqual(final T y) {
return !this.testEqual(y);
}
}
public interface IOrd<T> extends IEq<T> {
public abstract Boolean lessEqualThan(final T y);
public default T min(final T y) {
if(lessEqualThan(y)) return this; // <--- ERROR: cannot convert from IOrd<T> to T
else return y;
}
}
Этот код стиля ООП очень похож на https://en.wikipedia.org/wiki/Bounded_quantification.
Разница в том, что я перемещаю внешнюю функцию (Fmin) в метод Object (мин)
Мой вопрос: возможно ли вернуть "this" в универсальном интерфейсе (IOrd) с реализацией по умолчанию (min: T -> T), используя f-ограниченную квантификацию?
1 ответ
Вы не можете вернуться IOrd<T>
в методе, который возвращает T
, Вы должны изменить свою подпись:
public abstract Boolean lessEqualThan(final IOrd<T> y);
public default IOrd<T> min(final IOrd<T> y) {
if(lessEqualThan(y)) return this;
else return y;
}
Если вы хотите вернуться T
Вы должны предоставить способ получить T
значение из вашего класса реализации:
public abstract Boolean lessEqualThan(final T y);
T getTValue(); // Your implementation must provide a way to get the T value
public default T min(final T y) {
if(lessEqualThan(y)) return getTValue();
else return y;
}