Spliterator.OfInt中tryAdvance的奇怪实现

时间:2015-06-20 10:23:33

标签: java lambda java-8 spliterator

它是如何工作的? 如何将Unsafe强制转换为Consumer<? super Integer> ??

IntConsumer

2 个答案:

答案 0 :(得分:5)

强制转型为绑定方法引用action::accept提供目标类型,它等同于lambda x -> action.accept(x)IntConsumer目标类型导致这个lambda(更愿意接受一个I​​nteger)被调整为接受一个int(这将导致在将参数传递给action.accept()之前隐式地加框)。

答案 1 :(得分:1)

由于发布的代码中存在两个类型强制转换,因此您的问题并不十分明确。

第一个通过instanceof检查Consumer<? super Integer>是否也实现IntConsumer然后执行普通类型转换,假设实现Consumer和{{1}的类同时用相同的语义来做到这一点。与the documentation比较:

  

实施要求

     

如果操作是IntConsumer的实例,则将其转换为IntConsumer并传递给tryAdvance(java.util.function.IntConsumer);,否则操作将通过装箱适应IntConsumer的实例IntConsumer的参数,然后传递给tryAdvance(java.util.function.IntConsumer)

因此,第一个IntConsumer检查和类型转换是合同的第一部分,如果instanceof参数实现两个接口,则避免装箱。

第二种类型演员是所描述的对拳击action的改编的一部分,而拳击由method reference IntConsumer暗示。此方法引用引用方法void accept(T t)(其中(IntConsumer) action::accept)可以适应T := ? super Integer的函数签名,described by Brian Goetz。由于此功能签名不仅满足IntConsumer的签名,而且(当然)IntConsumer的签名,需要使用类型转换来消除重载Consumer<? super Integer>方法之间的歧义。使用等效的lambda表达式

时没有必要
tryAdvance