Java泛型使用指南
泛型(Generics)是Java 5引入的重要特性,它让开发者能够编写更安全、更灵活的代码。下面我将泛型的使用方法。
1. 泛型基本概念
泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数。
优点:
- 类型安全:编译时进行类型检查
- 消除强制类型转换
- 提高代码重用性
2. 泛型类
// 定义一个泛型类
public class Box<T> {
private T t;
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
// 使用
Box<String> stringBox = new Box<>();
stringBox.set("Hello");
String str = stringBox.get(); // 无需强制类型转换
3. 泛型方法
public class Util {
// 泛型方法
public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {
return p1.getKey().equals(p2.getKey()) &&
p1.getValue().equals(p2.getValue());
}
}
// 使用
Pair<Integer, String> p1 = new Pair<>(1, "apple");
Pair<Integer, String> p2 = new Pair<>(2, "pear");
boolean same = Util.<Integer, String>compare(p1, p2);
4. 类型通配符
// 通配符
public static void printList(List<?> list) {
for (Object elem : list) {
System.out.print(elem + " ");
}
}
// 上界通配符
public static double sumOfList(List<? extends Number> list) {
double s = 0.0;
for (Number n : list) {
s += n.doubleValue();
}
return s;
}
// 下界通配符
public static void addNumbers(List<? super Integer> list) {
for (int i = 1; i <= 10; i++) {
list.add(i);
}
}
5. 泛型限制
- 不能使用基本类型:
List<int>
错误,应该用List<Integer>
- 不能实例化泛型类型:
T obj = new T();
错误 - 不能声明静态泛型变量:
private static T instance;
错误 - 不能对泛型参数使用instanceof:
if (obj instanceof T)
错误
6. 实际应用场景
集合框架
List<String> list = new ArrayList<>();
Map<Integer, String> map = new HashMap<>();
自定义数据结构
public class TreeNode<T> {
private T value;
private List<TreeNode<T>> children;
// ...
}
工具类
public class Pair<A, B> {
public final A first;
public final B second;
// ...
}
7. 实践
- 尽量使用泛型:提高代码类型安全性
- 避免使用原生类型:如应使用
List<String>
而非List
- 优先使用通配符:增加API灵活性
- 合理使用边界:
extends
和super
正确使用
掌握泛型可以显著提高Java代码的质量和可维护性,是Java开发者必须掌握的核心技能之一。
(牛站网络)