Почему это разрешает тип к интерфейсу?

1

Я попытался реализовать универсальный метод 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". Как я могу это исправить?

  • 0
    Можете ли вы показать нам значение date1 и date2 ?
  • 0
    любое ненулевое значение
Теги:
generics

2 ответа

1

Я нашел решение, мне нужно было добавить ? super T ? super T к объявлению параметра типа:

public static <T extends Comparable<? super T>> T max(T o1, T o2) {
    return o1.compareTo(o2) >= 0 ? o1 : o2;
}
0

для java.time.LocalDate параметр типа разрешает ChronoLocalDate и я не могу понять, почему

Это происходит потому, что LocalDate реализует LocalDate Comparable<ChronoLocalDate> (в отличие от Comparable<LocalDate>).

Из Джавадока.

Все реализованные интерфейсы:

Serializable, Comparable<ChronoLocalDate>, ...
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  • 0
    Спасибо за объяснение, я действительно нашел решение случайно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню