一、引入:
1、需求:定义一个函数可以接收任意类型的集合对象。
2、思路:因为这几天一直在学习泛型,尤其是自定义泛型,所以最先我的想法就是使用自定义泛型。
public class Demo8 {
public static void main(String[] args) {
//但是发现使用自定义泛型与需求不符,使用自定义泛型传入String类型也是可以的,而需求是任意类型的集合对象。
print("abc");
}
public static <T>void print(T t){
}
}
3、改进
二、泛型的上下限:
1、泛型中的通配符: ?
泛型中的通配符一般不单独使用,基本都是结合泛型的上下限来使用的!
2、需求:
需求一: 定义一个函数可以接收任意类型的集合对象, 要求接收的集合对象只能存储Integer或者是Integer的父类类型数据。
1)格式:泛型的下限
? super Integer : 只能存储Integer或者是Integer父类元素。
2)代码分析
需求二: 定义一个函数可以接收任意类型的集合对象, 要求接收的集合对象只能存储Number或者是Number的子类类型数据。
1)格式:泛型的上限
? extends Number : 只能存储Number或者是Number类型的子类数据。
2)代码分析: