使用 & 的奇怪 Java 转换语法
Strange Java cast syntax using &
(其实这个问题和lambdas没有直接关系,而是和casts using bounds有关,所以标记为duplicate的问题没有提供这个问题的答案。你'我会在这里找到 我的 问题的答案:How should I cast for Java generic with multiple bounds?)
就在最近,我参加了一个SW工艺会议。在所讨论的示例之一中,我遇到了这种转换,它似乎是有效的 Java 自 Java 8.
Object aTest = (String & CharSequence) "test";
我的问题:谁能告诉我这背后的成语以及它究竟能为我们做什么?示例的演示者无法解释它,我也没有找到任何提及(我什至不知道它的名字)。
除了 Oleksandr 的 之外,我还必须在这里给出另一个答案,因为这个问题已经被标记为重复,因此被锁定了。
与此同时,我能够构建一个(人为的)用例,只是为了让想法更清晰。
假设我们有泛型方法 foo()
,它在其唯一参数上是泛型的,并且类型参数有两个上限(针对 Comparable
和 Serializable
):
public static <T extends Comparable & Serializable> void foo(T t) {
System.out.println(t);
}
进一步假设,我们有一个 class AClass
,它实现了 Comparable
和 Serializable
public class AClass implements Comparable, Serializable {
@Override
public int compareTo(Object other) {
return 0;
}
}
进一步假设人为的部分,我们有一个 AClass
object instance
,它被分配给一个类型为 Object
:
的变量
Object instance = new AClass();
如果,在代码的另一个地方,我们想将instance
传递给foo()
,而我们不知道instance
的动态类型(即AClass
),我们可以使用特殊的强制转换语法在 instance
上放置一个 "contact lens" 以使调用有效:
foo((Comparable & Serializable) instance);
其实,特长不在于cast语法,而在于如何指定类型。此类型规范声明了一个 so-called 交集类型 .
这是一个 cast operator,可以包含类型列表:
(ReferenceType {AdditionalBound}) Expression => (String & CharSequence) "test";
其中 AdditionalBound
定义为:
... & InterfaceType
I'm understanding this generally, but what about a use case?
这个 question 和答案描述了一个真实的实际用例。例如,要使 lambda 表达式可序列化,您可以这样写:
Consumer<String> consumer = (Consumer<String> & Serializable) System.out::println;
(感谢@assylias)
(其实这个问题和lambdas没有直接关系,而是和casts using bounds有关,所以标记为duplicate的问题没有提供这个问题的答案。你'我会在这里找到 我的 问题的答案:How should I cast for Java generic with multiple bounds?)
就在最近,我参加了一个SW工艺会议。在所讨论的示例之一中,我遇到了这种转换,它似乎是有效的 Java 自 Java 8.
Object aTest = (String & CharSequence) "test";
我的问题:谁能告诉我这背后的成语以及它究竟能为我们做什么?示例的演示者无法解释它,我也没有找到任何提及(我什至不知道它的名字)。
除了 Oleksandr 的 之外,我还必须在这里给出另一个答案,因为这个问题已经被标记为重复,因此被锁定了。
与此同时,我能够构建一个(人为的)用例,只是为了让想法更清晰。
假设我们有泛型方法 foo()
,它在其唯一参数上是泛型的,并且类型参数有两个上限(针对 Comparable
和 Serializable
):
public static <T extends Comparable & Serializable> void foo(T t) {
System.out.println(t);
}
进一步假设,我们有一个 class AClass
,它实现了 Comparable
和 Serializable
public class AClass implements Comparable, Serializable {
@Override
public int compareTo(Object other) {
return 0;
}
}
进一步假设人为的部分,我们有一个 AClass
object instance
,它被分配给一个类型为 Object
:
Object instance = new AClass();
如果,在代码的另一个地方,我们想将instance
传递给foo()
,而我们不知道instance
的动态类型(即AClass
),我们可以使用特殊的强制转换语法在 instance
上放置一个 "contact lens" 以使调用有效:
foo((Comparable & Serializable) instance);
其实,特长不在于cast语法,而在于如何指定类型。此类型规范声明了一个 so-called 交集类型 .
这是一个 cast operator,可以包含类型列表:
(ReferenceType {AdditionalBound}) Expression => (String & CharSequence) "test";
其中 AdditionalBound
定义为:
... & InterfaceType
I'm understanding this generally, but what about a use case?
这个 question 和答案描述了一个真实的实际用例。例如,要使 lambda 表达式可序列化,您可以这样写:
Consumer<String> consumer = (Consumer<String> & Serializable) System.out::println;
(感谢@assylias)