Comparator.comparing 中的按位和比较器与可序列化之间
bitwise and between Comparator and Serializable in Comparator.comparing
我正在查看 Java8
中实现的 Comparator.comparing
方法的源代码
这是代码
public static <T, U> Comparator<T> comparing(
Function<? super T, ? extends U> keyExtractor,
Comparator<? super U> keyComparator)
{
Objects.requireNonNull(keyExtractor);
Objects.requireNonNull(keyComparator);
return (Comparator<T> & Serializable)
(c1, c2) -> keyComparator.compare(keyExtractor.apply(c1),
keyExtractor.apply(c2));
}
为什么需要 Comparator
和 Serializable
之间的按位 and
以及它的作用?
(Comparator<T> & Serializable)
可以简单地转换为 Comparator
进行链接。
在非数值的情况下,按位运算如何工作?
谢谢。
这不是类型之间的按位运算,而是交集类型,向编译器表明,当它生成与 lambda 表达式对应的类型时,该类型应该同时实现 Comparator
和 Serializable
接口。
在这种情况下,单个 & 不是按位运算符。它是 Comparator 和 Serializable 类型的交集。您断言您希望 return 类型同时实现 Comparator 和 Serializable。这里的技巧是,只要交集只产生一个抽象方法,就可以采用接口的交集。看
https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.16
按位运算符(&、^、|)可用于比较布尔值和数字类型,但这不是此处发生的情况。参见 https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.22
我正在查看 Java8
中实现的Comparator.comparing
方法的源代码
这是代码
public static <T, U> Comparator<T> comparing(
Function<? super T, ? extends U> keyExtractor,
Comparator<? super U> keyComparator)
{
Objects.requireNonNull(keyExtractor);
Objects.requireNonNull(keyComparator);
return (Comparator<T> & Serializable)
(c1, c2) -> keyComparator.compare(keyExtractor.apply(c1),
keyExtractor.apply(c2));
}
为什么需要 Comparator
和 Serializable
之间的按位 and
以及它的作用?
(Comparator<T> & Serializable)
可以简单地转换为 Comparator
进行链接。
在非数值的情况下,按位运算如何工作?
谢谢。
这不是类型之间的按位运算,而是交集类型,向编译器表明,当它生成与 lambda 表达式对应的类型时,该类型应该同时实现 Comparator
和 Serializable
接口。
在这种情况下,单个 & 不是按位运算符。它是 Comparator 和 Serializable 类型的交集。您断言您希望 return 类型同时实现 Comparator 和 Serializable。这里的技巧是,只要交集只产生一个抽象方法,就可以采用接口的交集。看 https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.16
按位运算符(&、^、|)可用于比较布尔值和数字类型,但这不是此处发生的情况。参见 https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.22