为什么这会将类型解析为接口?

时间:2015-03-20 07:28:11

标签: java generics

我尝试为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”。我该如何解决?

2 个答案:

答案 0 :(得分:1)

我找到了解决方案,我需要将? super T添加到类型参数声明中:

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

答案 1 :(得分:0)

  对于java.time.LocalDate

,类型参数解析为ChronoLocalDate,我无法弄清楚为什么

这是因为LocalDate实现了Comparable<ChronoLocalDate>(而不是Comparable<LocalDate>)。

来自Javadoc

  

所有已实施的接口:

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