代碼片段
public > List findBy(B entity) throws HibernateException
逐層解析
| 部分 | 含義 |
| `public` | 訪問修飾符 |
| `>` | 類型參數聲明:定義類型變量 `B`,其**上界**為 `A extends Serializable>` |
| `List` | 返回類型:元素類型為 `B` 的 List |
| `findBy` | 方法名 |
| `(B entity)` | 參數:類型為 `B` 的實體對象 |
| `throws HibernateException` | 異常聲明 |
核心:`>` 詳細含義
- `B` 是類型參數**,方法調用時由實參類型推導或顯式指定。
- `extends` 表示「是...的子類型」** (接口用 implements,泛型統一用 extends)。
- `A extends Serializable>` 是 `B` 的上界**:
- `A` 是某個泛型類/接口 (如 `BaseEntity`)。
- `? extends Serializable` 是**通配符上界**:`A` 的類型參數必須是 `Serializable` 或其子類型。
- 即:`B` 必須繼承/實現 `A`,其中 `X` 實現了 `Serializable` 接口。
具體示例
// 定義基類
class BaseEntity { ... } // A = BaseEntity
// 合法子類 (B)
class User extends BaseEntity { ... } // Long 實現 Serializable ✓
class Order extends BaseEntity { ... } // String 實現 Serializable ✓
class Product extends BaseEntity { ... } // BigDecimal 實現 Serializable ✓
// 非法子類
class Invalid extends BaseEntity { ... } // Thread 不實現 Serializable ✗
class Raw extends BaseEntity { ... } // 原始類型,未指定類型參數 ✗ (編譯警告)
// 方法調用
User user = new User();
List users = dao.findBy(user); // B 推導為 User,符合上界
設計意圖
- 約束實體標識類型可序列化**:確保 `A` 的泛型參數 (通常為 ID 類型) 可序列化,支持分布式緩存、遠程調用、持久化。
- 類型安全**:編譯期阻止非 Serializable ID 類型的實體傳入。
- 靈活性**:允許不同實體使用不同 ID 類型 (Long, String, UUID 等),只要實現 `Serializable`。
通配符 `? extends` vs `? super` 速查
| 通配符 | 含義 | 適用場景 | 操作限制 |
| `? extends T` | 上界通配符:類型是 T 或 T 子類 | **讀取** (Producer) - `List extends Number>` 可取出 Number | 不可寫入 (除 null) |
| `? super T` | 下界通配符:類型是 T 或 T 父類 | **寫入** (Consumer) - `List super Integer>` 可放入 Integer | 取出只能作 Object |
記憶口訣:**PECS** (Producer Extends, Consumer Super)。