它是如何工作的?
如何将Unsafe
强制转换为Consumer<? super Integer>
??
IntConsumer
答案 0 :(得分:5)
强制转型为绑定方法引用action::accept
提供目标类型,它等同于lambda x -> action.accept(x)
。 IntConsumer
目标类型导致这个lambda(更愿意接受一个Integer)被调整为接受一个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