我正在查看在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));
}
为什么and
和Comparator
之间的位Serializable
是必需的以及它的作用是什么?
(Comparator<T> & Serializable)
可以简单地将其转换为Comparator
进行链接。
在非数字值的情况下,逐位操作如何工作?
感谢。
答案 0 :(得分:3)
这不是类型之间的按位操作,而是交集类型,向编译器指示,当它生成对应于lambda表达式的类型时,此类型应实现Comparator
和Serializable
接口。
答案 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