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);
}
| 參數 | 約束 | 語義 |
|---|---|---|
| K | extends Serializable | 主鍵類型,必須可序列化(支持分布式、緩存、網絡傳輸) |
| E | extends DBVersionEntity<K> | 實體類型,必須繼承帶版本控制的基類,泛型參數為主鍵類型 K |
getId()、getVersion() 等基類定義的方法此處 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),導致運行時強轉異常,失去編譯期保護。
泛型邊界是「設計時契約」,將運行時錯誤前移至編譯期,是大型系統類型安全的基石。