gpt4 book ai didi

java - 为什么这个 lambda 表达式使用 & 符号转换?

转载 作者:行者123 更新时间:2023-12-04 02:32:31 25 4
gpt4 key购买 nike

最近我无意中发现了 Java Comparator 类中的以下代码:

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));
}

令我困惑的是 (Comparator<T> & Serializable)部分。由于该方法只返回一个比较器,所以我看不到在转换为可序列化时的用途。我也看不出以这种方式转换任何东西的原因,还是我遗漏了什么?

在我看来,如果我想将一个 Object 转换为多种可能的类型,我可以像这样引入另一个泛型类型:

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

这样返回的值可以分配给 Comparator 或 Serializable 变量。

我能想到的唯一其他原因是将该转换用作某种类型检查,以查看 lambda 表达式是否实际返回可序列化。

如果你们中的任何人有过这种转换的经验或者知道这样的转换可以实现什么,我们将不胜感激。

最佳答案

Since the method only returns a Comparator I don't see the use in casting to Serializable.

强制转换告诉类型检查器被返回的对象需要实现这两个接口(interface)。在创建作为 lambda 表达式结果的对象时会使用此信息。

如果没有转换,返回的Comparator 对象 实现了Comparator 接口(interface)。如果比较器存储在可序列化对象的字段中,则会出现问题:

class MyClass implements Serializable {
final Comparator<MyClass> comparator = Comparator.comparing(...)
}

如果您现在序列化此类的一个实例,则比较器对象也会被序列化。如果比较器对象没有作为父类(super class)型的 Serializable 接口(interface),您将得到一个异常。

关于java - 为什么这个 lambda 表达式使用 & 符号转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63377790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com