java - 使用 & 的奇怪 Java 转换语法

标签 java casting java-8 type-bounds bounded-types

<分区>

(实际上,这个问题与 lambda 没有直接关系,而是与使用边界的强制转换相关,因此标记为重复的问题不提供该问题的答案。您将找到答案我的问题在这里:How should I cast for Java generic with multiple bounds? )

就在最近,我参加了一个 SW 工艺 session 。在所讨论的示例之一中,我遇到了这种类型转换,它似乎是自 Java 8 以来有效的 Java。

Object aTest = (String & CharSequence) "test";

我的问题:谁能告诉我这背后的成语以及它究竟能为我们做什么?示例的演示者无法解释它,我也没有找到任何提及(我什至不知道它的名字)。

除了 Oleksandr 的答案之外,我还必须在这里给出另一个答案,因为这个问题已经被标记为重复,因此已被锁定。

与此同时,我能够构建一个(人为的)用例,只是为了让想法更清晰。

假设我们有泛型方法foo(),它在其唯一参数上是泛型的,并且类型参数有两个上限(相对于Comparable可序列化):

public static <T extends Comparable & Serializable> void foo(T t) {
    System.out.println(t);
}

进一步假设,我们有一个类AClass,它实现了ComparableSerializable

public class AClass implements Comparable, Serializable {
    @Override
    public int compareTo(Object other) {
        return 0;
    }
}

进一步假设人为的部分,我们有一个 AClass 对象 instance,它被分配给 Object 类型的变量:

Object instance = new AClass();

如果,在代码的另一个地方,我们想将instance传递给foo(),而我们不知道instance的动态类型(即 AClass),我们可以使用特殊的强制转换语法在 instance 上放置一个“隐形眼镜”来使调用工作:

foo((Comparable & Serializable) instance);

其实,特殊之处不在于cast语法,而在于如何指定类型。此类型规范声明了所谓的交集类型

最佳答案

这是一个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)

关于java - 使用 & 的奇怪 Java 转换语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51070344/

相关文章:

Java 并发 : Shared Memory Between Threads

c++ - 函数样式转换与调用构造函数

ios - 如何不从字典中强制转换值

Java - SAM类型优化

java - Eclipse 不会停止使用 Java SE1.8

java - NumberFormatException - 具有十六进制值的字符串

JavaFX如何将一个形状重叠到另一个上

java - 没有从 PreferenceScreen 中的 CheckBoxPreference 接收值?

Android:如何将字符串转换为日期?

java - 等待 List<Future> 中的每个 Future 完成