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));
}

为什么需要 ComparatorSerializable 之间的按位 and 以及它的作用?

(Comparator<T> & Serializable)

可以简单地转换为 Comparator 进行链接。

在非数值的情况下,按位运算如何工作?

谢谢。

这不是类型之间的按位运算,而是交集类型,向编译器表明,当它生成与 lambda 表达式对应的类型时,该类型应该同时实现 ComparatorSerializable 接口。

在这种情况下,单个 & 不是按位运算符。它是 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