【问题标题】:bitwise and between Comparator and Serializable in Comparator.comparingComparator.comparing 中的 Comparator 和 Serializable 之间的按位和
【发布时间】:2016-11-12 15:37:03
【问题描述】:

我在看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 进行链接。

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

谢谢。

【问题讨论】:

标签: java java-8 comparator


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在这种情况下,单个 & 不是按位运算符。它是 Comparator AND Serializable 类型的交集。您断言您希望返回类型同时实现 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

    【讨论】:

      猜你喜欢
      • 2011-03-20
      • 2017-08-14
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      相关资源
      最近更新 更多