2015-03-20 3 views
1

я попытался реализовать общий max(a, b) метод Object с, которые реализуют 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

любое значение, отличное от нуля – Oliv

ответ

1

Я нашел решение, мне нужно, чтобы добавить ? 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 реализует Comparable<ChronoLocalDate> (в отличие от Comparable<LocalDate>).

От Javadoc.

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

Serializable, Comparable<ChronoLocalDate>, ... 
       ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
+0

Благодарим за объяснение, я действительно нашел решение случайно. – Oliv

Смежные вопросы