instanceof 是 Java 的二元運算子,用於測試左邊物件是否為右邊類別(或介面、父類別)的實例,回傳 boolean。基本語法:
String s = "Hello";
boolean isObject = s instanceof Object; // true
許多開發者習慣用 instanceof 判斷子類型再轉型處理:
public double calculate(Bill bill) {
if (bill instanceof PhoneBill) { /* 計算電話帳單 */ }
if (bill instanceof GasBill) { /* 計算燃氣帳單 */ }
}
這其實是反模式。 應善用多型與方法多載:
public double calculate(PhoneBill bill) { /* ... */ }
public double calculate(GasBill bill) { /* ... */ }
只有在「無法修改類別結構」或「必須在運行時動態判斷型別」的罕見情境下,才考慮使用 instanceof。
Fragment 需呼叫所屬 Activity 的特定方法時,因 getActivity() 回傳 Activity 基類型,需先判斷再轉型:
if (getActivity() instanceof MainActivity) {
((MainActivity) getActivity()).showCustomMenu();
}
這避免了 ClassCastException,也符合「針對特定 Activity 子類型才執行特定邏輯」的需求。
Adapter 拿到的 context 可能來自不同 Activity,需根據實際型別決定顯示邏輯:
if (context instanceof CommodityWarningActivity) {
holder.entNameLayout.setVisibility(View.VISIBLE);
holder.entName.setText(list.get(position).getCorporationName());
} else {
holder.entNameLayout.setVisibility(View.GONE);
}
Context 代表應用場景/上下文,這裡利用其具體子類型進行條件渲染,是 Android 開發中常見且合理的用法。
instanceof。instanceof 是實用的妥協方案。理解 instanceof 的本質與適用邊界,能寫出更健壯、符合物件導向原則的 Android 程式碼。