首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个lambda表达式使用符号进行强制转换?

为什么这个lambda表达式使用符号进行强制转换?
EN

Stack Overflow用户
提问于 2020-08-12 13:41:01
回答 3查看 460关注 0票数 3

最近,我无意中发现了Java比较器类中的以下代码:

代码语言:javascript
复制
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)部分。由于该方法只返回一个比较器,所以我不认为在“转换为可序列化”中使用。我也不明白为什么会有这样的事情发生,或者我错过了什么?

在我看来,如果我想将一个对象转换成多种可能的类型,我只需介绍另一个泛型类型,如下所示:

代码语言:javascript
复制
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表达式是否真的返回一个可序列化的。

如果你们中的任何一个人都有这样的演员经验,或者知道像这样的演员能完成什么任务,那么任何帮助都是非常感谢的。

EN

Stack Overflow用户

发布于 2020-08-12 14:01:33

,因为该方法只返回一个比较器,所以我不认为在将其转换为Serializable时使用。

强制转换告诉类型检查器,要返回的对象需要实现两个接口。在创建对象时使用此信息,该对象是lambda表达式的结果。

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

代码语言:javascript
复制
class MyClass implements Serializable {
     final Comparator<MyClass> comparator = Comparator.comparing(...)
}

如果您现在序列化这个类的一个实例,比较器对象也会被序列化。如果比较器对象没有将可序列化接口作为超级类型,您将得到一个异常。

票数 3
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63377790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档