Я попытался реализовать универсальный метод max(a, b)
для Object
s, который реализует Comparable
следующим образом:
public static <T extends Comparable<T>> T max(T o1, T o2) {
return o1.compareTo(o2) >= 0 ? o1 : o2;
}
Он работает, например, для String
, но для java.time.LocalDate
параметр типа разрешает ChronoLocalDate
и я не могу понять, почему:
LocalDate date1 = ..., date2 = ...;
LocalDate ld = CompareUtils.max(date1, date2); // compile error here
Ошибка: "Тип несоответствия: невозможно преобразовать из ChronoLocalDate в LocalDate". Как я могу это исправить?
Я нашел решение, мне нужно было добавить ? super T
? super T
к объявлению параметра типа:
public static <T extends Comparable<? super T>> T max(T o1, T o2) {
return o1.compareTo(o2) >= 0 ? o1 : o2;
}
для
java.time.LocalDate
параметр типа разрешаетChronoLocalDate
и я не могу понять, почему
Это происходит потому, что LocalDate
реализует LocalDate
Comparable<ChronoLocalDate>
(в отличие от Comparable<LocalDate>
).
Из Джавадока.
Все реализованные интерфейсы:
Serializable, Comparable<ChronoLocalDate>, ... ^^^^^^^^^^^^^^^^^^^^^^^^^^^
date1
иdate2
?