为什么Java 8的Comparator.comparing()将返回值强制转换为Serializable?

时间:2017-01-06 06:15:13

标签: java casting

来自JDK8的Comparator.java

public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
        Function<? super T, ? extends U> keyExtractor)
{
    Objects.requireNonNull(keyExtractor);
    return (Comparator<T> & Serializable)
        (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}

请注意,return语句的前缀是一个有趣的演员:(Comparator<T> & Serializable)

我已经意识到并且(我认为)理解:

  • 通用类型限制中的&运算符(并且可以在此处推断其目的),
  • Serializable界面。

然而,在演员阵容中一起使用对我来说是令人困惑的。

如果返回类型不需要它,& Serializable的目的是什么?

我不明白这个意图。

对欺骗/关闭请求的跟进:此问题How to serialize a lambda?不回答问题。我的问题特别注意到返回类型没有提到Serializable,因此是我混淆的来源。

1 个答案:

答案 0 :(得分:8)

Comparator.comparing()的javadoc说:

  

如果指定的函数也是可序列化的,则返回的比较器是可序列化的。

强制转换确保Java用于实现lambda的内部类将implements Serializable