| 術語 | 方向 | 語法 | 是否自動 | 風險 |
|---|---|---|---|---|
| 向上轉型 | 子類 → 父類 | Parent p = new Child(); | 自動(隱式) | 安全,無信息損失 |
| 向下轉型 | 父類 → 子類 | Child c = (Child) parent; | 強制(顯式) | 可能拋 ClassCastException |
「父類對象轉換為子類對象就是向下轉型 程序會自動完成」—— 錯誤。向下轉型必須強制轉換,且運行時檢查實際對象類型。
「子類對象轉換為父類對象為向上轉型需要強制類型轉換」—— 錯誤。向上轉型自動完成,無需強轉。
checkcast 字節碼,運行時驗證。class Animal { void eat() {} }
class Dog extends Animal { void bark() {} }
public class Test {
public static void main(String[] args) {
// 向上轉型:自動
Animal a = new Dog();
a.eat(); // OK
// a.bark(); // 編譯錯誤:Animal 無 bark 方法
// 向下轉型:強制
Dog d = (Dog) a; // 運行時檢查 a 真實類型是否 Dog
d.bark(); // OK
// 錯誤示例
Animal a2 = new Animal();
// Dog d2 = (Dog) a2; // 運行時拋 ClassCastException
}
}
instanceof 判斷:if (a instanceof Dog) { Dog d = (Dog) a; }。List<Animal> list = new ArrayList<Dog>(); 錯誤,需用 List<? extends Animal>)。