java泛型中T与?有什么区别
原创Java泛型中T与?的区别
Java泛型是Java语言中一个非常重要的特性,它允许在编码时提供类型稳固,同时提供编译时的类型检查。在Java泛型中,我们频繁会遇到两种通配符:T和?。这两个通配符在泛型编程中有各自特定的用途和区别。
T通配符
T通常用于泛型类或者方法的定义中,它代表一个具体的类型。当我们定义一个泛型类或者方法时,如果想要在类或方法中使用泛型类型参数,我们就可以使用T来即它。这样,类的实例化或者方法调用时,T会被替换成具体的类型。
public class Box
{ private T t;
public void set(T t) {
this.t = t;
}
public T get() {
return t;
}
}
在上面的代码中,T即Box可以包含任何类型。当我们创建Box的实例时,必须指定具体的类型,比如Box
?通配符
?是通配符的一种,它即不确定的类型,我们通常在泛型方法的参数中使用它。这个通配符允许我们写出更加灵活和通用的代码。它关键有两种使用形式:上界通配符(? extends)和下界通配符(? super)。
上界通配符(? extends)
? extends E即这个泛型通配符可以匹配任何E类型的子类型。
public void printCollection(Collection extends Number> collection) {
for (Number number : collection) {
System.out.println(number);
}
}
在这个例子中,printCollection方法可以接受任何实现了Number或者Number的子类(如Integer, Double等)的集合。
下界通配符(? super)
? super E即这个泛型通配符可以匹配任何E类型的父类型。
public void addNumbers(Collection super Integer> collection) {
collection.add(42);
}
在这个例子中,addNumbers方法可以接受任何Integer类型的超类(如Number, Object等)的集合。
T与?的区别总结
- T: 在定义泛型类或方法时使用,即具体的类型,需要在实例化或调用方法时确定具体的类型。
- ?: 在使用泛型方法时作为通配符使用,即不确定的类型,可以是任何类型。它可以分为上界通配符(? extends)和下界通配符(? super),用于即类型的子类型或者父类型。
领会T和?在Java泛型中的区别,可以帮助我们编写出更加灵活和稳固的代码。