Comparator编译类型推断失败原因

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的比较器

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值