在Java的泛型中,我们常常会遇到两个符号:问号(?)和大写字母T。这两个符号都在泛型中使用,但具有不同的作用和含义。本文将详细介绍问号和T在Java泛型中的区别。
1. 问号的含义
问号(?)被称为通配符(Wildcard),用于表示未知的类型。通配符可以用于定义泛型类、泛型接口、泛型方法的参数或返回类型。
1.1 无界通配符
无界通配符(Unbounded Wildcard)表示未知的类型,可以接受任何类型的参数。例如:
```java public void printList(List> list) { for (Object o : list) { System.out.println(o); } } ```上述代码中,printList方法使用了无界通配符作为参数类型,因此可以接受任何类型的List作为参数。
1.2 上界通配符
上界通配符(Upper Bounded Wildcard)用于限制泛型的类型范围,表示参数必须是某个类或其子类。例如:
```java public void processList(List extends Number> list) { for (Number n : list) { // 处理逻辑 } } ```上述代码中,processList方法使用了上界通配符限定了参数类型必须是Number类或其子类。
1.3 下界通配符
下界通配符(Lower Bounded Wildcard)用于限制泛型的类型范围,表示参数必须是某个类或其父类。例如:
```java public void addNumbers(List super Integer> list) { list.add(1); list.add(2); list.add(3); } ```上述代码中,addNumbers方法使用了下界通配符限定了参数类型必须是Integer类或其父类。
2. T的含义
T是一种泛型类型形参,用于定义泛型类、泛型接口、泛型方法的类型。T表示某个具体但未知的类型,可以根据实际需要进行替换。
2.1 类型擦除
在Java泛型中,类型擦除是指在编译时将泛型的类型信息擦除,将泛型类型参数替换为其边界或Object类型。例如:
```java public class Box上述代码中,虽然使用了泛型类型参数T,但实际上在编译时,T将被擦除成Object类型。
2.2 类型推断
T类型参数的推断是指在调用泛型方法或创建泛型类实例时,根据实际参数的类型推断泛型类型参数。例如:
```java List上述代码中,通过类型推断,我们可以知道List的泛型类型参数是Integer。
总结
问号和T是Java泛型中常见的符号,具有不同的作用和含义。问号通配符用于表示未知的类型,可以用于泛型类、泛型接口、泛型方法的参数或返回类型;而T是一种泛型类型形参,用于定义泛型类、泛型接口、泛型方法的类型。问号通配符可以表示任意类型,而T表示某个具体但未知的类型。在使用泛型时,需要根据实际需求选择合适的符号。