Java 14 引入了增强的 instanceof
操作符,它具有类型测试模式作为预览特性。类型测试模式具有一个谓词来指定带有单一绑定变量的类型。从 Java 17 开始,这成为了 Java 的标准特性。
增强的 instanceof 操作符语法
在下面的代码片段中,我们使用 instanceof
操作符来测试 person
对象是否为 Employee
类型,并将其赋值给 Employee
引用 e
,然后用于对 Employee
对象进行操作。
if (person instanceof Employee e) {
return e.getEmployeeId();
}
在此之前,开发人员必须显式地进行类型转换,如下面的代码片段所示。
无增强的 instanceof 操作符语法
在下面的代码片段中,我们展示了测试 person
对象是否为 Employee
类型的传统方法,然后在 if
块中,将 person
类型转换为 Employee e
以对 Employee
对象进行操作。
if (person instanceof Employee) {
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) {
Person manager = new Manager(23, "Robert");
System.out.println(getId(manager));
}
public static int getId(Person person) {
if (person instanceof Employee) {
Employee e = (Employee)person;
return e.getEmployeeId();
}
else if (person instanceof Manager) {
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) {
Person manager = new Manager(23, "Robert");
System.out.println(getId(manager));
}
public static int getId(Person person) {
if (person instanceof Employee e) {
return e.getEmployeeId();
}
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