599CN.COM - 【源码之家】老牌网站源码下载站,提供完整商业网站源码下载!

java泛型中?和T的区别

源码网2023-07-14 10:21:17190JAVA类型参数问号

在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 list) { for (Number n : list) { // 处理逻辑 } } ```

上述代码中,processList方法使用了上界通配符限定了参数类型必须是Number类或其子类。

1.3 下界通配符

下界通配符(Lower Bounded Wildcard)用于限制泛型的类型范围,表示参数必须是某个类或其父类。例如:

```java public void addNumbers(List list) { list.add(1); list.add(2); list.add(3); } ```

上述代码中,addNumbers方法使用了下界通配符限定了参数类型必须是Integer类或其父类。

2. T的含义

T是一种泛型类型形参,用于定义泛型类、泛型接口、泛型方法的类型。T表示某个具体但未知的类型,可以根据实际需要进行替换。

2.1 类型擦除

在Java泛型中,类型擦除是指在编译时将泛型的类型信息擦除,将泛型类型参数替换为其边界或Object类型。例如:

```java public class Box { private T t; public T get() { return t; } public void set(T t) { this.t = t; } } ```

上述代码中,虽然使用了泛型类型参数T,但实际上在编译时,T将被擦除成Object类型。

2.2 类型推断

T类型参数的推断是指在调用泛型方法或创建泛型类实例时,根据实际参数的类型推断泛型类型参数。例如:

```java List list = new ArrayList<>(); list.add(1); ```

上述代码中,通过类型推断,我们可以知道List的泛型类型参数是Integer。

总结

问号和T是Java泛型中常见的符号,具有不同的作用和含义。问号通配符用于表示未知的类型,可以用于泛型类、泛型接口、泛型方法的参数或返回类型;而T是一种泛型类型形参,用于定义泛型类、泛型接口、泛型方法的类型。问号通配符可以表示任意类型,而T表示某个具体但未知的类型。在使用泛型时,需要根据实际需求选择合适的符号。

转载声明:本站发布文章及版权归原作者所有,转载本站文章请注明文章来源!

本文链接:https://599cn.com/post/9610.html