java - 使用 & 的奇怪的 Java 强制转换语法
问题描述
(实际上,这个问题与 lambdas 没有直接关系,而是与使用边界的强制转换有关,所以标记为重复的问题并没有提供这个问题的答案。你可以在这里找到我的问题的答案:我应该如何为 Java强制转换具有多个边界的泛型?)
就在最近,我参加了一个 SW 工艺会议。在一个讨论的示例中,我遇到了这种类型的转换,它似乎是自 Java 8 以来有效的 Java。
Object aTest = (String & CharSequence) "test";
我的问题:谁能告诉我这背后的成语以及它究竟能为我们做什么?该示例的演示者无法解释它,我也没有找到任何提及(我什至不知道它的名称)。
除了 Oleksandr's 之外,我还必须在这里提供另一个答案,因为这个问题已经被标记为重复,因此被锁定。
与此同时,我能够构建一个(人为的)用例,只是为了让这个想法更清楚。
假设我们有泛型方法foo()
,它的唯一参数是泛型的,并且类型参数有两个上限(反对Comparable
和Serializable
):
public static <T extends Comparable & Serializable> void foo(T t) {
System.out.println(t);
}
进一步假设,我们有一个类AClass
,它实现Comparable
和Serializable
public class AClass implements Comparable, Serializable {
@Override
public int compareTo(Object other) {
return 0;
}
}
进一步假设人为的部分,我们有一个AClass
object instance
,它被分配给 type 的变量Object
:
Object instance = new AClass();
如果在代码的另一个地方,我们想要传递instance
给foo()
,并且我们不知道instance
( 是AClass
) 的动态类型,我们可以使用特殊的强制转换语法来放置一个“隐形眼镜”instance
以使调用工作:
foo((Comparable & Serializable) instance);
实际上,特长不在于转换语法,而在于如何指定类型。这个类型规范声明了一个所谓的交集类型。
解决方案
它是一个可以包含类型列表的 强制转换运算符:
(ReferenceType {AdditionalBound}) Expression => (String & CharSequence) "test";
其中AdditionalBound
定义为:
... & InterfaceType
我一般都理解这一点,但是用例呢?
这个问题和答案描述了一个真实的实际用例。例如,要使 lambda 表达式可序列化,您可以编写:
Consumer<String> consumer = (Consumer<String> & Serializable) System.out::println;
(感谢@assylias)
推荐阅读
- python - OpenCV视频播放:重新打开视频时不显示图像
- vue.js - 属性或方法“item”未在实例上定义,但在渲染期间引用
- node.js - 错误:尝试启动应用程序时找不到模块“commander”
- python - psycopg2 为 json_agg 返回单引号而不是双引号
- sparql - Wikidata 查询服务为实体搜索返回空
- sql-server - 将 MSSQL 数据库与 docker 连接
- laravel - 型号 [App\Models\Customer] 背包没有查询结果
- r - 如何根据R中的字符向量从df中提取部分字符串
- sql-server - 无法修复 sql 查询中的语法错误
- java - 致命异常:java.lang.OutOfMemoryError