本文將通過一個實際示例,來深入講解 Java 泛型中的上下限及其應用場景。在這個示例中,我們會實現一個泛型類 Info
和兩個泛型方法 upperLimit
和 lowerLimit
,并解釋其工作機制。
1. 什么是 Java 泛型上下限?
Java 泛型的上下限是通過關鍵字 extends
和 super
定義的。它們的作用是對泛型類型參數施加約束,規定可接受的類型范圍。
- 上限通配符
? extends T
:限制泛型類型必須是T
類型或其子類。 - 下限通配符
? super T
:限制泛型類型必須是T
類型或其父類。
2. 示例場景
我們會創建一個泛型類 Info
用于存儲數據,隨后實現兩個方法:
upperLimit
:接收一個Info
類型對象,其泛型類型是Number
或其子類,返回存儲的數據。lowerLimit
:接收一個Info
類型對象,其泛型類型是String
或其父類,返回存儲的數據。
最后,通過一個主函數對方法進行驗證。
3. 代碼實現
(1)泛型類 Info
首先,我們實現 Info
類:
class Info<T> {private T data;public void set(T data) {this.data = data;}public T get() {return data;}
}
T
是一個泛型參數,表示可以存儲任意類型的數據。set
方法用于設置數據。get
方法用于獲取數據。
(2)解決方案類 Solution
接下來,我們實現 Solution
類,其中包含 upperLimit
和 lowerLimit
方法。
class Solution {public Number upperLimit(Info<? extends Number> info) {// 直接返回 info 中存儲的數據return info.get();}public Object lowerLimit(Info<? super String> info) {// 直接返回 info 中存儲的數據return info.get();}
}
upperLimit
方法:接收一個泛型類型為? extends Number
的Info
對象,表示該對象只能存儲Number
類型或其子類(例如Integer
、Double
等)。lowerLimit
方法:接收一個泛型類型為? super String
的Info
對象,表示該對象只能存儲String
類型或其父類(例如Object
)。
(3)主函數
最后,在主函數中測試以上方法。
public class Main {public static void main(String[] args) {// 創建 Solution 對象Solution solution = new Solution();// 測試 upperLimit 方法Info<Integer> info = new Info<>();info.set(200); // 設置值為 200Number number = solution.upperLimit(info);if (!number.equals(200)) {System.out.println("Verification failure.");return;}// 測試 lowerLimit 方法Info<String> infos = new Info<>();infos.set("Xx"); // 設置值為 "Xx"Object obj = solution.lowerLimit(infos);if (!obj.equals("Xx")) {System.out.println("Verification failure.");return;}System.out.println("Verification passed.");}
}
4. 運行結果
如果實現無誤,運行程序后會輸出:
Verification passed.
5. 解析
- 泛型上限
? extends Number
:- 在
upperLimit
方法中,Info<? extends Number>
表示該Info
對象只能存儲Number
或其子類的數據。 - 在實際代碼中,傳入了
Info<Integer>
對象,Integer
是Number
的子類,因此符合限制。
- 在
- 泛型下限
? super String
:- 在
lowerLimit
方法中,Info<? super String>
表示該Info
對象只能存儲String
或其父類的數據。 - 在實際代碼中,傳入了
Info<String>
對象,String
符合限制。
- 在
6. 總結
通過上述代碼,我們可以看到:
- 泛型上限
? extends T
用于限制泛型類型為某個類型T
或其子類。 - 泛型下限
? super T
用于限制泛型類型為某個類型T
或其父類。 Info
泛型類 是存儲數據的基礎,其泛型特性使其能適應多種數據類型。
通過這些特性,Java 的泛型機制讓代碼更安全、更靈活,同時減少了類型轉換的麻煩。在實際開發中,善用泛型上下限可以幫助我們構建更健壯的代碼。