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
廣告