【译】超越Java 8:instanceof的模式匹配

130 阅读3分钟

介绍

根据一些调查(如JetBrains的出色调查),尽管Java 8是2014年发行的,但它目前是使用最多的Java版本。

本文是系列文章中的第一篇,标题为“超越Java 8”,其灵感来自于我的《Java for Aliens》一书的内容。这些文章将引导读者逐步探索从Java 9引入的最重要的功能。其目的是使读者了解从Java 8向前迈进的重要性,并说明最新的Java带来的巨大优势。语言版本。

在本文中,我们将看看Java 14中作为预览功能引入的一个有趣的新颖性(请参阅相关文章)。这是称为模式匹配的复杂功能的第一部分。尽管将来,它将影响将来的各种编程结构,但是模式匹配仅可与instanceof操作员一起用作功能预览。这将从根本上改变我们使用此运算符的方式。

instanceof运营商

instanceof与比较运算符一样,二进制运算符将返回布尔值。该运算符的独特之处在于它使用引用作为第一个操作数,并使用复杂类型作为第二个操作数。true如果在运行时引用(定义第一个操作数)指向由类型(定义第二个操作数)实例化的对象,则返回。true即使引用指向由第二个操作数指定的类型的子类实例化的对象,它也会返回。如果不满足这两个条件之一,则instanceof操作员返回false

假设我们要创建一个确定公司员工薪水的系统,并考虑以下类别:

![image-20210105153715747](/Users/bytedance/Library/Application Support/typora-user-images/image-20210105153715747.png)

假设我们必须向所有类型的员工支付薪水,我们可以开始将公司的所有员工归为一个异构集合

![image-20210105153738542](/Users/bytedance/Library/Application Support/typora-user-images/image-20210105153738542.png)

要管理员工工资,我们可以创建以下方法:

![image-20210105153753729](/Users/bytedance/Library/Application Support/typora-user-images/image-20210105153753729.png)

这使instanceof操作员可以测试多态参数emp所指向的类型,并相应地设置薪水。

现在,我们可以在一个foreach循环(具有180次迭代)中调用此方法,传递异构集合的所有元素,从而达到我们的目标:

![image-20210105153846796](/Users/bytedance/Library/Application Support/typora-user-images/image-20210105153846796.png)

对象投射

在前面的示例中,我们观察到instanceof操作员允许我们测试参考点指向哪种类型的实例。但是,我们已经知道,指向由子类实例化的对象的超类引用无法访问在子类中声明的成员。例如,假设程序员的薪水取决于经验的年限。在这种情况下,测试引用是否emp指向Programmer实例后,我们将需要访问yearsOfExperience变量。