本文展示泛型在類定義層面的應用:泛型介面、泛型方法、型別參數邊界限定 (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>
<E extends Exception>E 必須為 Exception 或其子類別。action.method() 拋出的異常類型符合宣告,呼叫端可精確捕獲具體異常。<T extends Comparable<T> & Serializable> (用 & 分隔,最多一個類,其餘為介面)。public static <E extends Exception> void execute(...)throws E 讓編譯器強制檢查受檢異常,避免「拋出 Exception 大雜燴」。new Action<NoSuchMethodException>() { ... }
在 Java 7 以前,匿名類別需完整寫出泛型參數;Java 8+ 可配合 Lambda 進一步簡化 (但受檢異常需自行處理)。
源碼中 GenericIdentify.java (未展示) 可能存在原始類型使用或未受檢轉型。建議啟用 -Xlint:unchecked 定位並修復。
interface Repository<T, ID extends Serializable> 統一 CRUD 契約。J2SE 1.5 的泛型邊界限定 (extends) 讓「型別安全的異常透傳」成為可能,配合泛型介面與方法,能構建高度可復用、編譯期可驗證的 API 契約。這是現代 Java 框架 (Spring, Hibernate, JPA) 核心設計基石之一。