JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

java 核心技术-12版 卷Ⅰ- 5.1.9 模式匹配

wys521 2024-11-28 09:00:33 精选教程 28 ℃ 0 评论

原文

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
   
   }
}
     

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表