Java 教程

Java 控制语句

面向对象编程

Java 内置类

Java 文件处理

Java 错误和异常

Java 多线程

Java 同步

Java 网络编程

Java 集合

Java 接口

Java 数据结构

Java 集合算法

高级 Java

Java 其他

Java API 和框架

Java 类引用

Java 有用资源

Java - instanceof 运算符的模式匹配



Java 14 引入了 instanceof 运算符,可以进行类型测试模式,作为预览功能。类型测试模式具有一个谓词,用于指定具有单个绑定变量的类型。从 Java 17 开始,它成为 Java 的标准功能。

增强型 instanceof 运算符的语法

在下面的代码片段中,我们使用了 instanceof 运算符来测试 person 对象是否为 Employee,并将 person 对象赋值给 Employee 引用 e,然后用它对 Employee 对象进行操作。

if (person instanceof Employee e) {
   return e.getEmployeeId();
}

在此增强功能之前,开发人员必须像下面这样对对象进行类型转换

非增强型 instanceof 运算符的语法

在下面的代码片段中,我们展示了使用 Employee 类测试 person 对象的常规方法,然后在 if 块中,我们将 person 类型转换为 Employee e 以对 Employee 对象进行操作。

if (person instanceof Employee) {
   // Unnecessary casting
   Employee e = (Employee)person;
   return e.getEmployeeId();
}

示例 - 旧语法

在这个例子中,我们定义了 Person、Employee 和 Manager 类。Employee 和 Manager 继承自 Person 类。在 APITester 类中,我们定义了一个 getId() 方法,它接受 Person 作为输入,并使用 instanceof 运算符测试对象的类型是 Employee 还是 Manager,然后根据 if 块的结果,我们将对象强制转换为 Employee 或 Manager 并相应地返回 employeeId 或 managerId。

package com.tutorialspoint;

public class APITester {
   public static void main(String[] args) {
      // Create a Manager Instance   
      Person manager = new Manager(23, "Robert");
      // Get and print Id of the manager
      System.out.println(getId(manager));
   }
   // using instanceof operator
   // to test type of Person to be Employee or Manager
   public static int getId(Person person) {
      // If person is Employee, assign it to e
      // in next statement	  
      if (person instanceof Employee) {
         // Unnecessary typecasting	  
         Employee e = (Employee)person;	  
         return e.getEmployeeId();
      } 
      // If person is Manager, assign it to m
      // in same statement	
      else if (person instanceof Manager) {
         // Unnecessary typecasting	  
         Manager m = (Manager)person;
         return m.getManagerId();
      }
      return -1;
   }
}
abstract sealed class Person permits Employee, Manager {
   String name;
   String getName() {
      return name;
   }
}
final class Employee extends Person {
   String name;
   int id;
   Employee(int id, String name){
      this.id = id;
      this.name = name;
   }
   int getEmployeeId() {
      return id;
   }
}
non-sealed class Manager extends Person {
   int id;
   Manager(int id, String name){
      this.id = id;
      this.name = name;
   }
   int getManagerId() {
      return id;
   }
}

输出

让我们编译并运行上面的程序,这将产生以下结果:

23

示例 - 新语法

在这个例子中,我们定义了 Person、Employee 和 Manager 类。Employee 和 Manager 继承自 Person 类。在 APITester 类中,我们定义了一个 getId() 方法,它接受 Person 作为输入,并使用 instanceof 运算符测试对象的类型是 Employee 还是 Manager,然后在同一个 if 块中,我们将对象赋值给 Employee 或 Manager 而无需类型转换,并相应地返回 employeeId 或 managerId。

package com.tutorialspoint;

public class APITester {
   public static void main(String[] args) {
      // Create a Manager Instance   
      Person manager = new Manager(23, "Robert");
      // Get and print Id of the manager
      System.out.println(getId(manager));
   }
   // using instanceof operator
   // to test type of Person to be Employee or Manager
   public static int getId(Person person) {
      // If person is Employee, assign it to e
      // in same statement	  
      if (person instanceof Employee e) {
         return e.getEmployeeId();
      } 
      // If person is Manager, assign it to m
      // in same statement	
      else if (person instanceof Manager m) {
         return m.getManagerId();
      }
      return -1;
   }
}
abstract sealed class Person permits Employee, Manager {
   String name;
   String getName() {
      return name;
   }
}
final class Employee extends Person {
   String name;
   int id;
   Employee(int id, String name){
      this.id = id;
      this.name = name;
   }
   int getEmployeeId() {
      return id;
   }
}
non-sealed class Manager extends Person {
   int id;
   Manager(int id, String name){
      this.id = id;
      this.name = name;
   }
   int getManagerId() {
      return id;
   }
}

输出

让我们编译并运行上面的程序,这将产生以下结果:

23
广告