在Comparator.comparing中按位和在Comparator和Serializable之间

时间:2016-11-12 15:37:03

标签: java java-8 comparator

我正在查看在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));
}

为什么andComparator之间的位Serializable是必需的以及它的作用是什么?

(Comparator<T> & Serializable)

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

在非数字值的情况下,逐位操作如何工作?

感谢。

2 个答案:

答案 0 :(得分:3)

这不是类型之间的按位操作,而是交集类型,向编译器指示,当它生成对应于lambda表达式的类型时,此类型应实现ComparatorSerializable接口。

答案 1 :(得分:2)

单身&amp;在这种情况下,它不是一个按位运算符。它是Comparator和Serializable类型的交集。您断言您希望返回类型同时实现Comparator和Serializable。这里的诀窍是,只要交集只产生一个抽象方法,就可以获取接口的交集。看到 https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.16

按位运算符(&amp;,^,|)可用于比较布尔值和数值类型,但这不是这里发生的事情。见https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.22