Java 8中Comparator调用thenComparing方法类型不匹配报错求解
报错原因分析
- 核心原因是Java泛型类型推断失败,具体逻辑如下:
- 你在
Comparator.comparing()中传入的lambda参数没有显式声明类型,编译器无法推断出这个Comparator的输入元素类型,默认会将其推断为Comparator<Object> - 后续调用
thenComparing(Comparator.naturalOrder())时,naturalOrder()要求待比较的元素必须实现Comparable接口,而Object类本身没有实现Comparable,泛型类型无法匹配,因此抛出该错误。
- 你在
解决方案
你可以任选以下一种方式修复类型推断问题:
- 给lambda参数显式指定类型,让编译器可以正确推断Comparator的泛型:
solicitudes = solicitudes.stream() .sorted(Comparator.comparing((CognodataEstadoSolicitudesDTO t) -> { Date fecha = null; try { fecha = t.getFechaSolicitudToDate(); } catch (ParseException e) { LOG.error(e.getMessage()); } return fecha; }) .thenComparing(Comparator.naturalOrder())) .collect(Collectors.toList());
- 显式声明
comparing方法的泛型参数:Comparator.<CognodataEstadoSolicitudesDTO, Date>comparing(你的lambda逻辑)
额外注意事项:
- 如果
CognodataEstadoSolicitudesDTO类没有实现Comparable接口,你不能直接使用Comparator.naturalOrder(),需要替换为具体的字段比较逻辑,比如thenComparing(CognodataEstadoSolicitudesDTO::getId)- 你当前的逻辑中如果日期解析失败会返回null,直接排序会触发空指针异常,建议用
Comparator.nullsFirst()或者Comparator.nullsLast()包装日期比较逻辑,比如:Comparator.comparing(你的lambda, Comparator.nullsFirst(Date::compareTo))
内容的提问来源于stack exchange,提问作者okjfokjrf
相关产品推荐
相关产品推荐

