int → long / double → int。
Animal animal = new Dog(); // 子類型 → 父類型
Object obj = "Hello"; // 介面/父類別引用指向子類別物件
Animal animal = new Dog();
Dog dog = (Dog) animal; // 必須強制轉型
ClassCastException。
// 場景 1:物件真實型別為父類別
Animal animal = new Animal(); // 真實是 Animal
Dog dog = (Dog) animal; // 執行時崩潰:Animal cannot be cast to Dog
// 場景 2:兄弟類別互轉
Cat cat = new Cat();
Dog dog = (Dog) cat; // 編譯錯誤:Cat 與 Dog 無繼承關係 (編譯器直接攔截)
// 場景 3:集合元素取出轉型
List
// Java 14+ 模式匹配
if (animal instanceof Dog dog) {
dog.bark(); // 自動轉型並賦值
}
// Java 14 前
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.bark();
}
// 不好:到處 instanceof 轉型
if (animal instanceof Dog) ((Dog)animal).bark();
else if (animal instanceof Cat) ((Cat)animal).meow();
// 好:定義抽象方法,子類別實作
abstract class Animal { abstract void makeSound(); }
class Dog extends Animal { void makeSound() { bark(); } }
class Cat extends Animal { void makeSound() { meow(); } }
// 使用
animal.makeSound(); // 多型分派,零轉型
List list = new ArrayList<>(); // 介面引用
// 僅使用 List 方法,無需轉型為 ArrayList
List strings = new ArrayList<>();
strings.add("hello");
// 編譯時警告:unchecked cast
List
鐵律:絕不轉型泛型集合。使用 List<?>、List<? extends T>、List<? super T> 通配符表達協變/逆變。
Dog[] dogs = new Dog[3]; Animal[] animals = dogs; (合法)。animals[0] = new Cat(); → ArrayStoreException。Dog[] dogs2 = (Dog[]) animals; (若 animals 真實為 Dog[] 則成功)。instanceof 檢查同樣極快,JIT 會優化。instanceof 守衛?→ 是 → 安全轉型。