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

Java 泛型進階:類型推斷與通配符深度解析

     編輯:Java 綜合教學

Java 泛型進階:類型推斷與通配符深度解析

Java 泛型的類型推斷機制與通配符系統,是編寫優雅、安全 API 的核心工具。本文從編譯器推斷邏輯、通配符上下界、PECS 原則三個維度,系統梳理進階用法。

一、類型推斷機制

1.1 泛型方法推斷

編譯器根據實參類型自動推導型別參數,無需顯式指定:

static <T> T pick(T a1, T a2) { return a2; }
Serializable s = pick("d", new ArrayList<String>()); // 推斷為 Serializable

1.2 鑽石語法與構造器推斷

Java 7+ 支援鑽石語法 <> 省略構造器型別參數,Java 8 進一步將方法參數納入目標類型推斷範圍:

Map<String, List<String>> map = new HashMap<>(); // 鑽石語法
processStringList(Collections.emptyList()); // Java 8 編譯通過

二、通配符體系詳解

2.1 上界通配符 <? extends T>

表示 T 及其子類型,適用於「只讀」場景(In 變量):

public void process(List<? extends Number> list) {
    Number n = list.get(0); // 安全讀取
    // list.add(new Integer(1)); // 編譯錯誤:不可寫入
}

2.2 下界通配符 <? super T>

表示 T 及其父類型,適用於「只寫」場景(Out 變量):

public void addIntegers(List<? super Integer> list) {
    list.add(1); // 安全寫入
    // Number n = list.get(0); // 僅能作為 Object 讀取
}

2.3 無限制通配符 <?>

等同於 <? extends Object>,僅能插入 null,適合調用與型別無關的方法(如 size()、clear())。

三、通配符捕獲與輔助方法

當編譯器無法確認型別安全時,可透過私有泛型輔助方法實現捕獲:

void foo(List<?> i) { fooHelper(i); }
private <T> void fooHelper(List<T> l) { l.set(0, l.get(0)); }

四、PECS 原則總結

  • Producer Extends:作為資料來源(In 變量)用 extends
  • Consumer Super:作為資料目的地(Out 變量)用 super
  • 雙向使用時勿用通配符,直接指定具體型別
  • 不建議在方法回傳型別使用通配符
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved