泛型
泛型(Generics)是Java语言中的一个重要特性,允许类、接口和方法在定义时使用类型参数,以便在使用时提供具体的类型。这使得代码更加灵活、可重用且类型安全。下面是对泛型的详细解释。
# 1. 泛型的基本概念
泛型的主要目的是在编译时提供类型安全检查,避免运行时的类型错误。它允许你定义类、接口或方法时,使用类型参数占位,具体类型在实例化时才指定。
示例:
// 定义一个泛型类
public class Box<T> {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
// 使用泛型类
public class Test {
public static void main(String[] args) {
Box<String> stringBox = new Box<>();
stringBox.setValue("Hello, Generics!");
String value = stringBox.getValue();
System.out.println(value);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 2. 泛型的类型参数
在泛型中,类型参数是用尖括号(<
和 >
)表示的。你可以定义一个或多个类型参数。
常用的类型参数包括:
- T: Type(类型)
- E: Element(元素)
- K: Key(键)
- V: Value(值)
示例:
public class Pair<K, V> {
private K key;
private V value;
public Pair(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() {
return key;
}
public V getValue() {
return value;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 3. 泛型类
泛型类是指在类定义时使用了类型参数的类。类型参数可以在类的字段、方法、构造函数等地方使用。
示例:
public class GenericClass<T> {
private T data;
public GenericClass(T data) {
this.data = data;
}
public T getData() {
return data;
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 4. 泛型方法
泛型方法是指在方法定义时使用了类型参数的方法。即使在非泛型类中,也可以定义泛型方法。
示例:
public class GenericMethodExample {
public <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# 5. 通配符
通配符(Wildcard)是泛型的一种特性,表示未知的类型。它常用于泛型方法和泛型类中。
?
: 表示任何类型? extends T
: 表示T或T的子类型? super T
: 表示T或T的父类型
示例:
public class WildcardExample {
public void printList(List<?> list) {
for (Object obj : list) {
System.out.println(obj);
}
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# 6. 泛型的优势
- 类型安全: 泛型可以在编译时检查类型,从而避免了运行时类型错误。
- 代码复用: 泛型类和方法可以与不同的类型一起使用,减少了代码的重复。
- 更好的代码可读性: 泛型提供了清晰的类型信息,使得代码更易于理解和维护。
# 7. 泛型的限制
- 不能创建泛型数组: 由于Java的类型擦除机制,不能直接创建泛型数组。
- 类型擦除: Java泛型在编译后会被擦除,类型参数会被替换成Object类型,这意味着泛型的具体类型信息在运行时不可用。
示例:
public class GenericArrayExample {
// 错误的代码,不能直接创建泛型数组
// private T[] array = new T[10];
// 使用 Object 类型数组来存储泛型类型
private Object[] array = new Object[10];
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# 总结
- 泛型 使得Java的集合类和其他类在编译时能够进行类型检查,提供了更好的类型安全性。
- 泛型允许类、接口和方法在定义时使用类型参数,提高了代码的灵活性和复用性。
- 泛型使用时需要注意类型擦除和泛型数组的限制。
通过使用泛型,你可以编写出更加健壮和灵活的代码。
在线编辑 (opens new window)
上次更新: 2025/02/25, 18:30:54