网站首页 > 精选教程 正文
原文
5.1.9 模式匹配
下面的代码
if (staff[1] instanceof Manager){
Manager boss =(Manager) staff [ i ];
boss.setBonus(5000);
}
实在有些冗长。我们真的需要反复提到子类 Manager 3 次吗?
在Java 16 中,还有一种更简便的方法。可以直接在 instanceof 测试中声明子类变量
if (staff[1] instanceof Manager boss){
boss.setBonus(5000);
}
如果 staff[i]是 Manager 类的一个实例,则变量 boss 设置为 staff[i],可以将其作为一个Manager。这样可以跳过强制类型转换。
如果 staff[i] 并非引用一个Manager,那么不会设置 boss,instanceof 操作符会生成false值。这样一来,将跳过 if 语句的主体。
提示: 使用instanceof 的大多数情况下,都需要应用一个子类方法。这就可以使用instanceof 的这种“模式匹配”形式,而不是使用强制类型转换。
没有用的instanceof 模式会是个错误:
Manager boss = (Manager )staff[1];
if (boss instanceof Employee e) . . . // ERROR: 0f course it's an Employee
个人补充:上面说的意思是 instanceof 模式匹配不能反向应用。因为boss 本来就必然是 Employee 所以用instanceof 判断是错误。也就是instanceof 语句只能用来断定“这只猫是不是黑猫” 而不能用来断定“这只黑猫是不是猫”,因为黑猫肯定是猫。
注释:为了与 Java 1.0向后兼容,尽管
if (boss instanceof Employee)
同样没有用,但这是允许的。
当 instanceof 模式引入一个变量时,可以立即在同一个表达式中使用这个变量:
Employee e;
if (e instanceof Manager m && m.getBonus() > 10000)
这是可以的,因为只有当丛表达式的左边为 true 时,才会计算 &表达式的右边。如果计算右边,说明m必然为一个Manager 实例不过,下面的代码会生成一个编译错误:
if (e instanceof Manager m ll m.getBonus() > 10000) ... // ERROR
当 || 的左边为 false 时,才会计算 || 的右边,所以变量没有绑定到 Manager 实例.下面是使用条件运算符的另一个例子:
double bonus = e instanceof Manager m ? m.getBonus() : 0;
变量m在 ? 后面的子表达式中定义,而不是在 : 后面的子表达式中定义。
注释:声明变量的 instanceof 形式称为“模式匹配”,这是因为它类似于 switch中的类型模式,这是 Java 17中的一个“预览”特性。我不会详细讨论预览特性,不过可以给出这个语法的一个例子:
String description = switch (e){
case Executive exec -> "An executive with a fancy title of" + exec.getTitle();
case Manager m ->“A manager with a bonus of" + m.getBonus();
default ->"A lowly employee with a salary of "+ e.getSalary();
}
与 instanceof 模式类似,每个类型模式会声明一个变量。
警告:类似于其他局部变量,instanceof 模式定义的局部变量会遮蔽字段。例如:
class Value{
private double v;
public boolean equals(Value other){
if (other instanceof LabeledValue v)
// v 1s the same as other
else
// v denotes the field
}
}
猜你喜欢
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 5.2.3相等测试与继承
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 5.2.4 hashCode方法
- 2024-11-28 Java入门书单
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 4.3.7 隐式参数与显式参数
- 2024-11-28 全网最完整的免费java教程讲义系列(四)——java的流程控制
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 4.6 对象构造 4.6.1重载
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 3.10 数组
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 4.3 自定义类
- 2024-11-28 2019年Java核心技术我整理了200多页pdf,今天分享给你
- 2024-11-28 java 核心技术12版卷1 - 1.3 Java applet 与 Internet
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)