首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java Swing 表格排序器 RowSorter 泛型參數詳解: 通配符上界機制

     編輯:程式設計綜合問答

方法簽名


public void setRowSorter(RowSorter sorter)

泛型通配符解析

符號名稱含義類比
`?`無界通配符任意類型,等價 ```List`
`? extends T`**上界通配符**T 或 T 的**子類型**(協變)`List` 接受 `List`
`? super T`下界通配符T 或 T 的**父類型**(逆變)`List` 接受 `List`

本例含義

`RowSorter` 表示:

  • 參數 `sorter` 的類型是 `RowSorter`
  • 其中 `X` 是 `TableModel` 或其**子類**(如 `DefaultTableModel`、`AbstractTableModel` 子類)
  • **只讀語境**:方法內部只會從 `sorter` 獲取 `TableModel` 功能,不會向其寫入具體模型

為什麼用上界?


// 內部實現邏輯示意
public void setRowSorter(RowSorter 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);

PECS 原則應用

  • Producer Extends:只從泛型讀取 → 用 `? extends T`
  • Consumer Super:只向泛型寫入 → 用 `? super T`

`setRowSorter` 只讀取模型數據進行排序,**Producer 角色** → **上界通配符 `? extends TableModel` 完全正確**。

總結

`? extends TableModel` 不是「奇怪語法」,而是**類型安全的精準表達**:接受任何基於 TableModel 及其子類的排序器,保證內部只調用 TableModel 接口方法。掌握 PECS 原則,泛型通配符不再神秘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved