public void setRowSorter(RowSorter extends TableModel> sorter)
| 符號 | 名稱 | 含義 | 類比 |
|---|---|---|---|
| `?` | 無界通配符 | 任意類型,等價 ` extends Object>` | `List>` |
| `? extends T` | **上界通配符** | T 或 T 的**子類型**(協變) | `List extends Number>` 接受 `List |
| `? super T` | 下界通配符 | T 或 T 的**父類型**(逆變) | `List super Integer>` 接受 `List |
`RowSorter extends TableModel>` 表示:
// 內部實現邏輯示意
public void setRowSorter(RowSorter extends TableModel> sorter) {
// 只調用 TableModel 定義的方法
TableModel model = sorter.getModel(); // 返回類型為 ? extends TableModel,安全向上轉型為 TableModel
model.getRowCount();
model.getValueAt(0, 0);
// 絕不會做:sorter.setModel(new MyModel()); // 編譯錯誤,類型不安全
}
JTable table = new JTable(dataModel); // dataModel 實現 TableModel
// 1. 使用默認排序器(內部用 DefaultRowSorter)
table.setAutoCreateRowSorter(true);
// 2. 手動設置排序器
TableRowSorter sorter = new TableRowSorter<>(dataModel);
sorter.setComparator(0, (s1, s2) -> s1.compareToIgnoreCase(s2)); // 自定義比較器
table.setRowSorter(sorter); // ✅ TableRowSorter 滿足 ? extends TableModel
// 3. 禁用排序
table.setRowSorter(null);
`setRowSorter` 只讀取模型數據進行排序,**Producer 角色** → **上界通配符 `? extends TableModel` 完全正確**。
`? extends TableModel` 不是「奇怪語法」,而是**類型安全的精準表達**:接受任何基於 TableModel 及其子類的排序器,保證內部只調用 TableModel 接口方法。掌握 PECS 原則,泛型通配符不再神秘。