Java8对lambda进行强制类型转换的技巧

今天在看Java8里Map的源码时发现了一个从没见过的写法

public static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K, V>> comparingByKey() {
    return (Comparator<Map.Entry<K, V>> & Serializable)
           (c1, c2) -> c1.getKey().compareTo(c2.getKey());
}
通常情况下,使用(Type)可以将一个对象的静态类型向下转型为Type。

在并列转型时,括号内最左边可以是一个class类型,也可以是一个interface类型,之后可以用&并列其他若干个interface类型(不能并列其他class类型)。若class类型不在被转类型的继承层次中,在编译时会报错,但interface类型如果不在被转类型的继承层次中,编译时不会报错(普通向下转型也是如此)。因为一个子类可以实现其父类没有实现的接口。
经测试,在对一个Lambda使用强制转型时,编译器会判断:
1.目标类型列表中是否有class类型,如果有则报错
2.目标类型列表中是否有函数式接口类型,如果没有则报错
3.目标类型列表中是否有多个带有抽象方法的接口类型(方法签名和返回值与Object中的方法相同的除外),如果有则报错
4.目标类型列表中的函数式接口是否和Lambda匹配,如果不匹配则报错

更新:
如果上面的代码在进行强制类型转换时,只是

(Comparator<Map.Entry<K, V>>)

那么return的对象不会实现Serializable接口。现在代码里的写法可以做到返回一个实现了Serializable的Comparator。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值