Comparator类型推断失败原因
话不多说直接上(出问题的)代码
public static void main(String[] args) {
List<String> list = Arrays.asList("nihao","hello","world","welcome");
// 编译器无法进行类型推断
Collections.sort(list, Comparator.comparingInt(item -> item.length()).reversed());
// 必须显示的指定类型
Collections.sort(list, Comparator.comparingInt( (String item) -> item.length()).reversed());
System.out.println(list);
}
编译器成功推断类型的方式
Collections.sort(list,Comparator.comparingInt(item -> item.length()));
编译器无法类型推断的方式
Collections.sort(list, Comparator.comparingInt(item -> item.length()).reversed());
以上的两种方式只是多了一个reversed()
方法的原因就导致了类型推断失败
// 这个是jdk Collections.sort()方法
@SuppressWarnings({"unchecked", "rawtypes"})
public static <T> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}
从以上的源码上看在传入集合后就确定了Comparator<? super T>
比较器类型,因为以上的例子是String
类型的集合,所以比较器Comarator
类型可能是String
或者是Object
// 这个是jdk reversed源码。去反
default Comparator<T> reversed() {
return Collections.reverseOrder(this);
}
从以上的源码来看,返回一个Comparator<T>
类型的比较器,因为这地方的调用返回的是固定T
类型的比较器,所以编译器在没有指定类型的比较器以Object(通用的类型)
从而返回一个Object
比较器,因为是Object的比较器