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

Java 泛型嵌套解讀:public > List findBy(B entity)

     編輯:程式設計綜合問答

代碼片段


public > List findBy(B entity) throws HibernateException

逐層解析

部分含義
`public`訪問修飾符
`>`類型參數聲明:定義類型變量 `B`,其**上界**為 `A`
`List`返回類型:元素類型為 `B` 的 List
`findBy`方法名
`(B entity)`參數:類型為 `B` 的實體對象
`throws HibernateException`異常聲明

核心:`>` 詳細含義

  1. `B` 是類型參數**,方法調用時由實參類型推導或顯式指定。
  2. `extends` 表示「是...的子類型」** (接口用 implements,泛型統一用 extends)。
  3. `A` 是 `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` 可取出 Number不可寫入 (除 null)
`? super T`下界通配符:類型是 T 或 T 父類**寫入** (Consumer) - `List` 可放入 Integer取出只能作 Object

記憶口訣:**PECS** (Producer Extends, Consumer Super)。

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