本文将通过一个实际示例,来深入讲解 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 的泛型机制让代码更安全、更灵活,同时减少了类型转换的麻烦。在实际开发中,善用泛型上下限可以帮助我们构建更健壮的代码。