instanceof 是 Java 的二元運算符,用於測試左側對象引用是否為右側類、接口或父類的實例。返回 boolean 值。
String s = "Hello";
boolean b = s instanceof Object; // true
boolean b2 = s instanceof CharSequence; // true
boolean b3 = s instanceof StringBuilder; // false
Object obj = getObject();
if (obj instanceof String) {
String str = (String) obj; // 安全轉型
System.out.println(str.length());
}
早期代碼常見用 instanceof 判斷具體子類執行不同邏輯:
public double calculate(Bill bill) {
if (bill instanceof PhoneBill) { /* ... */ }
else if (bill instanceof GasBill) { /* ... */ }
}
缺點:違反開閉原則,新增子類需修改此方法;屬於「面向對象中的反模式」。
public double calculate(PhoneBill bill) { /* ... */ }
public double calculate(GasBill bill) { /* ... */ }
// 或在 Bill 定義抽象方法 calculate(),子類覆寫
編譯器自動根據實參類型分發,擴展新子類無需修改現有代碼。
if (obj instanceof String str) {
// 直接使用 str,無需顯式轉型
System.out.println(str.length());
}
簡化「判斷+轉型」樣板代碼,提升可讀性。
String[] arr = new String[5];
boolean b = arr instanceof Object[]; // true,數組協變
boolean b2 = arr instanceof String[]; // true
null instanceof T 永遠返回 false,不拋 NPE。String vs Integer),編譯直接報錯「Incompatible types」。list instanceof List<String> 編譯錯誤,運行時泛型信息已擦除,只能寫 list instanceof List。instanceof 是類型檢查的基礎工具,但在業務邏輯中濫用預示著設計缺陷。優先考慮多態、訪問者模式或模式匹配(Java 14+)實現類型安全的擴展。