(C) obj)。Java 採用靜態類型檢查為主、動態檢查為輔的混合策略,核心目標:**「不要讓類型錯誤在運行期發生」**。
class A { A me() { return this; } void doA() { println("Do A"); } }
class B extends A { void doB() { println("Do B"); } }
class C extends A { void doC() { println("Do C"); } }
A a = new B().me(); // 編譯期類型:A | 運行期類型:B
a.doA(); // ✅ 編譯通過,運行正常
a.doB(); // ❌ 編譯報錯:A 類型沒有 doB() 方法
((B) a).doB(); // ✅ 編譯通過(強制轉型),運行正常
((C) a).doC(); // ✅ 編譯通過(編譯器只看聲明類型 A 可轉 C),運行拋 ClassCastException
(C) a?編譯器只知道變量 a 的**聲明類型是 A**,而 A 是 C 的父類,**理論上 A 的子類實例可能是 C**,所以編譯器樂觀通過。具體是否真的是 C,留待運行期檢查。
new B().me().doB() —— 聲明類型 A 無 doB。((C) new B().me()).doC() —— 聲明類型 A 可轉 C,但運行期炸。new 出來的對象類型(動態綁定,運行期可知)。(Child) parentRef 需開發者自行保證運行期真實類型匹配,否則 ClassCastException。instanceof 模式匹配(JDK 16+ if (obj instanceof String s))替代強轉。List 運行期變 List,編譯器插入隱式轉型,堆污染導致遠處拋異常 —— 用 @SuppressWarnings("unchecked") 謹慎標註。Java 靜態類型檢查是**「編譯期基於聲明類型的保守近似」**。它保證:如果編譯通過,運行期不會出現「方法不存在」「字段不存在」等結構性錯誤;但無法保證強制轉型、反射、泛型擦除等動態行為的類型安全,這部分風險轉移給開發者通過測試、代碼規範、動態檢查來承擔。