【问题标题】:Why does Java 8's Comparator.comparing() cast the return value to Serializable?为什么 Java 8 的 Comparator.comparing() 将返回值转换为 Serializable?
【发布时间】:2017-01-06 06:15:13
【问题描述】:

来自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&lt;T&gt; &amp; Serializable)

我已经知道并且(我认为)理解:

  • 泛型类型限制中的&amp; 运算符(并且可以在此处推断其用途),
  • Serializable 接口。

但是,在演员阵容中一起使用让我感到莫名其妙。

如果返回类型不需要&amp; Serializable,它的用途是什么?

我不明白意图。

跟进欺骗/关闭请求:此问题How to serialize a lambda? 不回答问题。我的问题特别指出返回类型没有提及Serializable,因此是我困惑的根源。

【问题讨论】:

  • 返回类型不是问题。将其转换为 Serializable 使其可序列化。此方法强制转换以允许调用者选择序列化结果。

标签: java casting


【解决方案1】:

Comparator.comparing() 的 javadoc 说:

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

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

【讨论】:

  • internal class used by Java to implement the lambda
  • 感谢您的澄清,但我仍然对这个演员阵容的存在感到有些困惑。为什么 JDK 库代码负责确保生成的 lambda 类的特性?如果规范要求生成 Serializable lambda 类,则永远不需要此转换。相反,如果规范没有要求,那么对于某些实现,这种转换可能会失败。
  • @mouselabs 在引用的文本中使用“if”一词使其“不是规范所要求的”。强制转换使 lambda 表达式本身可序列化,这意味着 如果 keyExtractor 对象是可序列化的,那么返回的 Comparator 也是可序列化的,即它确保支持序列化.
  • 啊...所以演员表的存在实际上驱动了生成的 lambda 类的那个方面。刚开始你确实这么说,我只是没听懂。感谢您的出色澄清。谢谢!
猜你喜欢
  • 2017-08-14
  • 2016-11-05
  • 2020-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-30
  • 2016-12-14
相关资源
最近更新 更多