一、泛型的定义
泛型的实质就是一个类型占位符 比如 T W E 等等
比如: List<String>list HashMap<String,Integer> map; 等等
二、泛型的应用
// 为了确定数据添加的指定类型而加入的
List<String> list =new ArrayList<>();
应用泛型类、泛型方法、泛型接口等等
三、泛型类
当类中属性不确定是什么类型的时候,可以使用类型占位符来进行站位,先定义一个泛型类
这样咱们在New对象的时候可以传入自己需要的类型
四、泛型的方法
占位符T必须与类的占位符相同,要不然编译器会报错,只有在类中定义,才能用到方法
当然,还有一种方法,可以不用在类中定义:
如果方法返回值,类型也不确定,应该怎么写:
那如果说泛型类的类型是T 方法是的类型是E 这样行不行呢?不报错,是可以的哈。泛型方法可以脱离泛型类中的指定类型。具体情况也是具体场景自有实现。
五、泛型接口
如果接口中指定是T,需要与泛型类中也指定一个类型,需要一致。
下面是一种内部类,如果impl<T> 是T 则 泛型类中也需要指定泛型是T
六、泛型的擦除模式
那看一下这种情况是否一致?
结果为true,那将t2的泛型改为Integer是否还能为True呢?是的 结果依然是true;这种就是泛型的擦除模式。在Java编译阶段,泛型是存在的,当处于反射阶段或者运行阶段,jvm会将泛型给取消掉,也就是擦除。为什么要有这样一个机制呢,就是为了兼容JDK老版本,不兼容会造成不共用,也是版本迭代中的产物。
七、泛型的通配符以及泛型的上边界、下边界
java中继承是有父子关系的,但泛型的继承关系是不承认的。
Integer 是继承了 Number的,看是否能向下向上转型进行相互赋值呢?
是的,这两个中间不互通。java中的继承关系,在泛型中不承认这种关系。这种情况就可以采用通配符 ? 来做。需要用通配符来进行重新绑定。
那直接看一下上边界 他的上边界就是 T
这种代表什么意思呢? 这种就是可以传入 T 或者 T的子类 如果传入的是Number,可以传入Integer类型。
那下边界也是如此:
这种就是 传入的类型必须是 本身或者T的父类, 如果传入的是Integer 那可以传入 Integer 或者 Number;
那上边界跟下边界的应用场景怎么区分呢?什么时候用上边界,什么时候用下边界呢?
既要读取又要写入就不要用通配符了。