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

J2SE 1.5 Tiger 新特性實戰(四):泛型類定義與泛型方法邊界限定

     編輯:J2SE

前言

本文展示泛型在類定義層面的應用:泛型介面、泛型方法、型別參數邊界限定 (extends Exception) 以及異常透傳的型別安全模式。

一、 程式碼範例:泛型介面與執行器模式

package tigers;
import java.io.UnsupportedEncodingException;

public class GenericExtends {
    public static void main(String[] args) {
        try {
            // 傳入不同具體異常類型的 Action 實作
            ActionToucher.execute(
                new Action<NoSuchMethodException>() {
                    public void method() throws NoSuchMethodException {
                        System.out.println("Action<NoSuchMethodException>");
                    }
                }
            );
            ActionToucher.execute(
                new Action<NoSuchFieldException>() {
                    public void method() throws NoSuchFieldException {
                        System.out.println("Action<NoSuchFieldException>");
                    }
                }
            );
            ActionToucher.execute(
                new Action<UnsupportedEncodingException>() {
                    public void method() throws UnsupportedEncodingException {
                        System.out.println("Action<UnsupportedEncodingException>");
                    }
                }
            );
        } catch (NoSuchMethodException | NoSuchFieldException | UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

// 泛型介面:型別參數 E 限定為 Exception 子類型
interface Action<E extends Exception> {
    void method() throws E;
}

// 執行器:泛型方法同樣限定 E extends Exception
class ActionToucher {
    public static <E extends Exception> void execute(Action<E> action) throws E {
        action.method();
    }
}

二、 編譯與執行

C:\tiger> javac -d c:\tiger\cls\ c:\tiger\src\*.java
Note: c:\tiger\src\GenericIdentify.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

C:\tiger> java -classpath c:\tiger\cls tigers.GenericExtends

三、 輸出結果

Action<NoSuchMethodException>
Action<NoSuchFieldException>
Action<UnsupportedEncodingException>

四、 核心技術點解析

1. 型別參數邊界限定 <E extends Exception>

  • 限定泛型參數 E 必須為 Exception 或其子類別。
  • 編譯器保證:action.method() 拋出的異常類型符合宣告,呼叫端可精確捕獲具體異常。
  • 支援多重邊界:<T extends Comparable<T> & Serializable> (用 & 分隔,最多一個類,其餘為介面)。

2. 泛型方法 public static <E extends Exception> void execute(...)

  • 方法層面宣告型別參數,獨立於類別泛型。
  • 呼叫時編譯器自動推導具體類型 (型別推論)。
  • 異常透傳:throws E 讓編譯器強制檢查受檢異常,避免「拋出 Exception 大雜燴」。

3. 匿名內部類實作泛型介面

new Action<NoSuchMethodException>() { ... }

在 Java 7 以前,匿名類別需完整寫出泛型參數;Java 8+ 可配合 Lambda 進一步簡化 (但受檢異常需自行處理)。

4. 編譯器警告:unchecked or unsafe operations

源碼中 GenericIdentify.java (未展示) 可能存在原始類型使用或未受檢轉型。建議啟用 -Xlint:unchecked 定位並修復。

五、 實務應用場景

  • 策略模式:以泛型介面定義策略契約,編譯期綁定具體行為與異常類型。
  • 回調/模板方法:框架定義泛型執行器,業務代碼提供具體實作與異常類型。
  • DAO/Repository:interface Repository<T, ID extends Serializable> 統一 CRUD 契約。

六、 總結

J2SE 1.5 的泛型邊界限定 (extends) 讓「型別安全的異常透傳」成為可能,配合泛型介面與方法,能構建高度可復用、編譯期可驗證的 API 契約。這是現代 Java 框架 (Spring, Hibernate, JPA) 核心設計基石之一。

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