Collection super Cat> // Consumer: 只能往裡放 Cat 或其子類 (安全)
Collection extends Animal> // Producer: 只能從裡取 Animal 或其父類 (安全)
| 通配符 | 可讀取類型 | 可寫入類型 | 典型用例 |
|---|---|---|---|
| `? extends Animal` | `Animal` (及父類 Object) | **無** (編譯錯誤,除 null) | 遍歷、複製、流處理 |
| `? super Cat` | `Object` (丟失具體類型) | `Cat` 及其子類 | 添加元素、比較器、回調 |
| `?` (無界) | `Object` | **無** | 只關心 size/clear/isEmpty 等與類型無關操作 |
List super Cat> consumer = new ArrayList(); // Animal 是 Cat 父類,合法
consumer.add(new Cat()); // ✅ Cat 是 Cat
consumer.add(new Kitty()); // ✅ Kitty 是 Cat 子類
consumer.add(new Animal()); // ❌ Animal 不是 Cat 子類
Object o = consumer.get(0); // 只能作為 Object 讀取
List extends Animal> producer = new ArrayList(); // Cat 是 Animal 子類,合法
Animal a = producer.get(0); // ✅ 取出的是 Animal
producer.add(new Cat()); // ❌ 編譯錯誤:不能保證列表真實類型能裝 Cat
producer.add(new Animal()); // ❌ 同上
// printA: 只需讀取元素並打印 → Producer → extends
public static void printA(Collection extends Animal> c) {
for (Animal a : c) System.out.println(a);
}
// printB: 若需往集合添加 Cat → Consumer → super
// 但打印通常不添加,故 extends 更合適
public static void printB(Collection extends Animal> c) { ... }
// 統一用 extends Animal 即可
Animal
▲
│ extends (向上擴散,讀取安全)
▼
Cat
▲
│ super (向下擴散,寫入安全)
▼
Kitty
原最佳回答僅貼鏈接。上文提供 PECS 原則、規則對比表、代碼驗證、記憶模型圖解,可直接指導實戰。