最近,我无意中发现了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));
}让我困惑的是(Comparator<T> & Serializable)部分。由于该方法只返回一个比较器,所以我不认为在“转换为可序列化”中使用。我也不明白为什么会有这样的事情发生,或者我错过了什么?
在我看来,如果我想将一个对象转换成多种可能的类型,我只需介绍另一个泛型类型,如下所示:
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));
}这样,可以将返回的值分配给比较器或可序列化变量。
我能想到的唯一其他原因是,使用该转换作为某种类型的类型来查看lambda表达式是否真的返回一个可序列化的。
如果你们中的任何一个人都有这样的演员经验,或者知道像这样的演员能完成什么任务,那么任何帮助都是非常感谢的。
发布于 2020-08-12 14:01:33
,因为该方法只返回一个比较器,所以我不认为在将其转换为Serializable时使用。
强制转换告诉类型检查器,要返回的对象需要实现两个接口。在创建对象时使用此信息,该对象是lambda表达式的结果。
如果没有强制转换,返回的Comparator对象将实现Comparator接口只实现。如果比较器存储在可序列化对象的字段中,则会出现问题:
class MyClass implements Serializable {
final Comparator<MyClass> comparator = Comparator.comparing(...)
}如果您现在序列化这个类的一个实例,比较器对象也会被序列化。如果比较器对象没有将可序列化接口作为超级类型,您将得到一个异常。
https://stackoverflow.com/questions/63377790
复制相似问题