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

Java 泛型接口設計解析:GenericDao> 邊界約束詳解

     編輯:程式設計綜合問答

代碼結構

public interface GenericDao> {
    E get(@Valid @NotNull K id);
    void save(@Valid @NotNull E entity);
    void delete(E entity);
    void delete(@Valid @NotNull K id);
}

泛型參數含義

參數約束語義
Kextends Serializable主鍵類型,必須可序列化(支持分布式、緩存、網絡傳輸)
Eextends DBVersionEntity<K>實體類型,必須繼承帶版本控制的基類,泛型參數為主鍵類型 K

為什麼要加邊界

  1. 類型安全:編譯期阻止傳入非 Serializable 主鍵(如自定義非序列化類)
  2. 契約規範:強制實體擁有 getId()、getVersion() 等基類定義的方法
  3. 自文檔化:接口簽名直接傳達設計意圖,減少文檔維護成本

extends 在類定義中的特殊含義

此處 E extends DBVersionEntity<K> 不是類繼承,而是泛型類型參數的上界聲明:

  • class A extends B:類 A 繼承類 B
  • <T extends SomeClass>:泛型參數 T 的上界為 SomeClass 及其子類

實際使用示例

// 實體
public class User extends DBVersionEntity { ... }

// DAO 實現
public class UserDao implements GenericDao {
    public User get(Long id) { ... }
    public void save(User user) { ... }
}

若不加邊界會怎樣

泛型退化為 <K, E>,調用者可傳入任意類型(如 GenericDao),導致運行時強轉異常,失去編譯期保護。

泛型邊界是「設計時契約」,將運行時錯誤前移至編譯期,是大型系統類型安全的基石。

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