T、E、K、V、? 的含义
T,E,K,V 是类型参数(Type Parameter),而?是通配符(Wildcard)。他们虽然都用在泛型中,但扮演的角色完全不同。Java 官方并没有强制规定这些字母的含义,只是社区形成了约定俗成的写法。常见规则如下:

为什么用泛型
- 类型不安全:可以存入任何类型(String、Integer 等),但取出时容易忘记转换或转换错误
- 繁琐的强制转换:每次取出都要手动 cast
- 运行时错误:如果类型转换错了,会抛出 ClassCastException
T
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class Box<T> {
private T item; // T是类型参数
public void setItem(T item) {
this.item = item;
}
public T getItem() {
return item; // 不需要强制转换
}
}
Box<String> stringBox = new Box<>();
stringBox.setItem("Hello");
// 自动就是String类型,无需转换
String s = stringBox.getItem();
|
无界通配符 ?
1
2
3
4
5
|
public static void printList(List<?> list) {
for (Object element : list) {
System.out.println(element);
}
}
|
上界通配符 ? extends T
表示“某种类型是 T 或 T 的子类”,适合生产者/只读场景
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public static void printNumbers(List<? extends Number> list) {
for (Number n : list) {
System.out.println(n);
}
}
public static void main(String[] args) {
List<Integer> ints = Arrays.asList(1, 2, 3);
List<Double> doubles = Arrays.asList(1.1, 2.2, 3.3);
// 可以读取元素为 Number 类型,不能add元素
printNumbers(ints); // Integer extends Number
printNumbers(doubles); // Double extends Number
}
|
下界通配符 ? super T
表示“某种类型是 T 或 T 的父类”,适合消费者/写入场景
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public static void addNumbers(List<? super Integer> list) {
list.add(10);
list.add(20);
}
public static void main(String[] args) {
List<Number> numbers = new ArrayList<>();
List<Object> objects = new ArrayList<>();
//可以安全向集合写入 Integer 类型
addNumbers(numbers); // Number 是 Integer 的父类
addNumbers(objects); // Object 是 Integer 的父类
System.out.println(numbers); // 输出 [10, 20]
System.out.println(objects); // 输出 [10, 20]
}
|
总结
读(生产者)用 extends,写(消费者)用 super。